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