1

我正在尝试采用一个大整数,即:123123123 并使用 3 位精度和逗号对其进行格式化。格式可以使用以下方式添加逗号:

'{:,}'.format(123123123)  # '123,123,123'

并指定浮点精度:

'{0:.2f}'.format(3.141592) # '3.14'

但是如果我想两者都做呢?

IE:

'{:,3d}'.format(123123123)  # ValueError

我想让它返回:123,000,000

4

2 回答 2

4

没有办法直接做到这一点。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), ',')
于 2013-11-07T01:21:06.773 回答
1

做到这一点的“正确”方法与 Python 版本无关(嗯 - 它必须有with2.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

对于 的负偏移量ndigitsround(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 上按预期工作。

于 2013-11-07T05:12:45.740 回答