将小数转换为带有浮点类型指示符{:,f} 的格式化字符串,无论是非常大的整数还是非常大的小数,它都会显示正确的位数来表示整数.
>>> val
Decimal('1000000000000000000000000')
>>> units
Decimal('1500000000')
>>> "{:,f}".format(units / val)
'0.0000000000000015'
# very large decimal integer, formatted as float-type string, appears without any decimal places at all when it has none! Nice!
>>> "{:,f}".format(units * val)
'1,500,000,000,000,000,000,000,000,000,000,000'
您无需指定小数位。它将仅显示表示数字所需的数量,当小数小于固定格式宽度时,会省略出现在最后一个小数位之后的无用零的踪迹。如果数字没有小数部分,您将不会得到任何小数位。
非常大的数字因此可以容纳,而无需再次猜测它们会有多大。而且您也不必再猜测它们是否会有小数位。
任何指定的千位分隔符 {:,f} 同样只有在证明该数字是大整数而不是长小数时才有效。
附带条件
但是,Decimal() 有这种重要位置的想法,如果它认为你需要它们,它会添加尾随零。
这个想法是它可以智能地处理您可能正在处理货币数字的情况,例如£ 10.15。要使用documentation 中的示例:
>>> decimal.Decimal('1.30') + decimal.Decimal('1.20')
Decimal('2.50')
如果你格式化 Decimal() 没有区别 - 如果 Decimal() 认为它很重要,你仍然会得到尾随零:
>>> "{:,f}".format( decimal.Decimal('1.30') + decimal.Decimal('1.20'))
'2.50'
当您将千位和分数放在一起时,也会发生同样的事情(也许是出于某种原因?):
>>> decimal.Decimal(2500) * decimal.Decimal('0.001')
Decimal('2.500')
使用 Decimal().normalize() 方法删除重要的尾随零:
>>> (2500 * decimal.Decimal('0.001')).normalize()
Decimal('2.5')