4

我有一个列表,其中包含某个数字'5.74536541',我将其转换为浮点数。

我正在使用 Python 3 打印它,("%0.2f" % (variable))但它总是打印出 5.75 而不是 5.74。

我知道您在考虑谁在乎,但这是针对货币转换器程序的,我不希望货币向上/向下舍入,但要准确。

我怎样才能让它不四舍五入,但又保持小数点后 2 位?

4

5 回答 5

9

由于您提到的舍入错误,您不应该使用浮点数作为货币。

您最好的选择是使用固定精度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为最终显示或单个最终值执行该步骤 - 所有中间步骤都应使用高精度Decimals 以使任何操作尽可能准确。

>>> 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'
于 2012-12-04T03:46:26.590 回答
4

如果您正在处理货币和准确性问题,请不要使用float,使用decimal.

于 2012-12-04T03:46:45.833 回答
1

浮点值被称为“有用的近似值”。无论你对浮点数做什么——舍入它,截断它,无论如何——如果结果是一个浮点值,就无法决定它的小数点右边有多少位。

永远不要对货币使用浮点值。参见pydoc decimal,例如。Python 的十进制模块支持十进制定点和十进制浮点运算。

Python 文档警告舍入浮点数

注意 浮点数的 round() 行为可能令人惊讶:例如,round(2.675, 2) 给出 2.67 而不是预期的 2.68。这不是错误:这是因为大多数小数部分不能完全表示为浮点数。

如果你不小心,你会被解释器提示符处出现的值误导

Python 只打印机器存储的二进制近似值的真实十进制值的十进制近似值。

重要的是要意识到这实际上是一种错觉:机器中的值并不完全是 1/10,您只是将真实机器值的显示四舍五入。一旦您尝试对这些值进行算术运算,这一事实就会变得明显

于 2012-12-04T03:46:50.560 回答
1

带走数字 mod 0.01

IE

rounded = number - (number % 0.01)

然后像以前一样打印它。

这就是说,四舍五入并不更准确。您是否正在尝试利用舍入错误方案从银行窃取资金?

于 2012-12-04T03:49:28.170 回答
-2

如果数字是字符串,则将字符串截断为小数点后仅 2 个字符,然后将其转换为浮点数。否则将其乘以 10^n,其中 n 是小数点后的位数,然后将浮点数除以 10^n。

于 2012-12-04T03:43:58.467 回答