我在python中遇到round()函数问题。当我将数字四舍五入到多个小数位(意图取出尾随零)时,输出通常以科学计数法给出。例如。:
round(75435000000.00,-6)= 7.5435E + 10
我需要以正常表示法输出,即75435000000.我使用十进制模块作为所涉及数字的十进制数据类型,并且在此模块内部是.normalize()方法,它取出尾随零并转换科学符号表示正常表示法,但我无法使其正常工作。
谢谢你的帮助,哈利
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')
使用x
可以看出y
和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')
舍入原始数字按照您希望的方式工作,因此您可以这样做:
def round_decimal(n, places):
return Decimal(round(float(n), places))
将其转换为浮点数,舍入,然后返回到小数。