我正在尝试采用一个大整数,即:123123123 并使用 3 位精度和逗号对其进行格式化。格式可以使用以下方式添加逗号:
'{:,}'.format(123123123) # '123,123,123'
并指定浮点精度:
'{0:.2f}'.format(3.141592) # '3.14'
但是如果我想两者都做呢?
IE:
'{:,3d}'.format(123123123) # ValueError
我想让它返回:123,000,000
我正在尝试采用一个大整数,即:123123123 并使用 3 位精度和逗号对其进行格式化。格式可以使用以下方式添加逗号:
'{:,}'.format(123123123) # '123,123,123'
并指定浮点精度:
'{0:.2f}'.format(3.141592) # '3.14'
但是如果我想两者都做呢?
IE:
'{:,3d}'.format(123123123) # ValueError
我想让它返回:123,000,000
没有办法直接做到这一点。Python 整数的全部意义在于它们是无限精度的。如果你想对它们进行四舍五入,你必须明确地这样做。实际上,当您尝试明显的情况时,异常中的消息告诉您:
>>> '{:,.3d}'.format(123123123)
ValueError: Precision not allowed in integer format specifier
所以,你在这方面的尝试是正确的……但它不仅仅是有点时髦:
'{:,.0f}'.format(round(123123123,-6))
没有理由显式地将其强制int
为 a float
,这样您就可以在没有任何小数值的情况下打印它。让它保持不变int
:
'{:,}'.format(round(123123123, -6))
除了更简单之外,这还意味着当您尝试打印一个巨大的整数时,它不会给您提供OverflowError
或丢失比您想要的更多的数字……</p>
在 Python 的早期版本(即 2.x)中,无论你给它什么类型, whereround
总是返回,你不能那样做;float
您可能想要编写一个简单的intround
函数。例如:
def intround(number, ndigits):
return (number + 5 * 10**(-ndigits-1)) // 10**-ndigits * 10**-ndigits
如果你知道你永远不会有一个整数太大而无法无损地放入 afloat
中,你可以int(round(*args))
改用 - 但实际上,如果你可以避免将整数转换为浮点数,你应该这样做。
而且,当我们这样做时,没有理由构建一个{}
字符串来调用该format
方法,当您可以调用 free 函数时:
format(round(123123123, -6), ',')
做到这一点的“正确”方法与 Python 版本无关(嗯 - 它必须有with
2.5+)是使用Decimal模块:
from __future__ import print_function
import decimal
import sys
if sys.version_info.major<3:
ic=long
else:
ic=int
def ri(i, places=6):
with decimal.localcontext() as lct:
lct.prec=places
n=ic(decimal.Decimal(i,)+decimal.Decimal('0'))
return format(n,',')
print(ri(2**99, 4))
# 633,800,000,000,000,000,000,000,000,000
print(ri(12349159111, 7))
# 12,349,160,000
print(ri(12349111111, 3))
# 12,300,000,000
如果你使用round 方法,它在 Python 2 上相当脆弱:
蟒蛇2:
>>> format(round(12349999999999999,-6),',')
'1.235e+16' # wrong....
它适用于 Python 3,但这是这样做的方法,因此舍入是从左到右的:
def rir(i, places=6):
return format(round(i, places-len(str(i))), ',')
print(rir(2**99, 4))
# 633,800,000,000,000,000,000,000,000,000
print(rir(12349159111, 7))
# 12,349,160,000
对于 的负偏移量ndigits
,round(number[, ndigits])将从右到左舍入浮点的尾数:
>>> round(123456789,-4)
123456789123460000
在具有较大数字的 Python 3 上效果很好:
>>> round(123456789123456789,-8)
123456789100000000
在 Python 2 上,功能因数字较大而中断:
>>> round(123456789,-4)
123460000.0
>>> round(123456789123456789,-4)
1.2345678912346e+17
使用 decimal 模块,它可以在 Python 2 和 Python 3 上按预期工作。