我有一个列表,其中包含某个数字'5.74536541'
,我将其转换为浮点数。
我正在使用 Python 3 打印它,("%0.2f" % (variable))
但它总是打印出 5.75 而不是 5.74。
我知道您在考虑谁在乎,但这是针对货币转换器程序的,我不希望货币向上/向下舍入,但要准确。
我怎样才能让它不四舍五入,但又保持小数点后 2 位?
我有一个列表,其中包含某个数字'5.74536541'
,我将其转换为浮点数。
我正在使用 Python 3 打印它,("%0.2f" % (variable))
但它总是打印出 5.75 而不是 5.74。
我知道您在考虑谁在乎,但这是针对货币转换器程序的,我不希望货币向上/向下舍入,但要准确。
我怎样才能让它不四舍五入,但又保持小数点后 2 位?
由于您提到的舍入错误,您不应该使用浮点数作为货币。
您最好的选择是使用固定精度decimal
,您还可以完全控制舍入和截断的工作方式。从文档:
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999,
capitals=1, flags=[], traps=[Overflow, DivisionByZero,
InvalidOperation])
>>> getcontext().prec = 6
>>> Decimal('3.0')
Decimal('3.0')
>>> Decimal('3.1415926535')
Decimal('3.1415926535')
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
>>> getcontext().rounding = ROUND_UP
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85988')
Decimals
您应该在内部以高精度表示所有基于货币的值(在您的情况下,标准精度水平应该没问题 - 不用prec
管它!)。如果您想向用户打印格式良好的美元和美分值,使用该locale
模块是一种直接的方法。
打印时要小心,因为您必须将Decimal
向下量化到正确的显示位置数,否则舍入将不会基于您的Decimal
上下文!您应该只quantize
为最终显示或单个最终值执行该步骤 - 所有中间步骤都应使用高精度Decimal
s 以使任何操作尽可能准确。
>>> from decimal import *
>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'en_AU.UTF-8'
>>> getcontext().rounding = ROUND_DOWN
>>> TWOPLACES = Decimal(10) ** -2
>>> var = Decimal('5.74536541')
Decimal('5.74536541')
>>> var.quantize(TWOPLACES)
Decimal('5.74')
>>> locale.currency(var.quantize(TWOPLACES))
'$5.74'
如果您正在处理货币和准确性问题,请不要使用float
,使用decimal
.
浮点值被称为“有用的近似值”。无论你对浮点数做什么——舍入它,截断它,无论如何——如果结果是一个浮点值,你就无法决定它的小数点右边有多少位。
永远不要对货币使用浮点值。参见pydoc decimal
,例如。Python 的十进制模块支持十进制定点和十进制浮点运算。
Python 文档警告舍入浮点数。
注意 浮点数的 round() 行为可能令人惊讶:例如,round(2.675, 2) 给出 2.67 而不是预期的 2.68。这不是错误:这是因为大多数小数部分不能完全表示为浮点数。
如果你不小心,你会被解释器提示符处出现的值误导。
Python 只打印机器存储的二进制近似值的真实十进制值的十进制近似值。
和
重要的是要意识到这实际上是一种错觉:机器中的值并不完全是 1/10,您只是将真实机器值的显示四舍五入。一旦您尝试对这些值进行算术运算,这一事实就会变得明显
带走数字 mod 0.01
IE
rounded = number - (number % 0.01)
然后像以前一样打印它。
这就是说,四舍五入并不更准确。您是否正在尝试利用舍入错误方案从银行窃取资金?
如果数字是字符串,则将字符串截断为小数点后仅 2 个字符,然后将其转换为浮点数。否则将其乘以 10^n,其中 n 是小数点后的位数,然后将浮点数除以 10^n。