Python - 圆形函数显示不需要的科学记数法

Python - Round Function displaying unwanted scientific notation

我在 python 中遇到 round() 函数的问题。当我将数字四舍五入到小数位时(目的是去除尾随零),输出通常以科学记数法给出。例如:

round(75435000000.00, -6) = 7.5435E+10

我需要以正常表示法输出,即 75435000000。我使用 decimal 模块来处理所涉及的数字的 Decimal 数据类型,该模块内部是 .normalize() 方法,它取出尾随零并将科学记数法转换为正常记数法,但我无法让它工作。

感谢您的帮助, 哈利

按您希望的方式对原始数字进行四舍五入,因此您可以这样做:

def round_decimal(n, places):
    return Decimal(round(float(n), places))

将其转换为浮点数、整数,然后再转换回十进制。

Python decimal.Decimal 数字有符号、数字和指数。一个给定的十进制数可以用不止一种方式书写,例如1230E0 或 123E1 和这些(比较相等时)在 decimal 模块中有不同的表示。

这是故意的;语义差异是重要的。 (就像在点对 100 球场后正好 100.00 下降到两个位置)。

你的例子中的数字四舍五入前后也是如此。四舍五入是在剥夺意义。 decimal 切换到科学记数法,因为这是避免显示没有意义的尾随零的唯一方法。

x = decimal.Decimal('75435000000.00')
x
# Decimal('75435000000.00')
y = round(x, -6)
y
# Decimal('7.5435E+10')

xy 之间的表示差异可以使用 as_tuple:

查看
x.as_tuple()
# DecimalTuple(sign=0, digits=(7, 5, 4, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0), exponent=-2)
y.as_tuple()
# DecimalTuple(sign=0, digits=(7, 5, 4, 3, 5), exponent=6)

y 没有尾随零被认为是规范化表示。

x.normalize()
# Decimal('7.5435E+10')

但是 quantize 可以让你回到你喜欢的形式。

z = y.quantize(0)
z
# Decimal('75435000000')

或者,如果点后需要两位数字:

y.quantize(decimal.Decimal('0.00'))
# Decimal('75435000000.00')