浮点格式的Python精度问题

浮点格式的Python精度问题,python,floating-point,precision,Python,Floating Point,Precision,请看我在Python 3.6解释器中输入的以下Python代码: >>> 0.00225 * 100.0 0.22499999999999998 >>> '{:.2f}'.format(0.00225 * 100.0) '0.22' >>> '{:.2f}'.format(0.225) '0.23' >>> '{:.2f}'.format(round(0.00225 * 100.0, 10)) '0.23' 希望你能马上

请看我在Python 3.6解释器中输入的以下Python代码:

>>> 0.00225 * 100.0
0.22499999999999998
>>> '{:.2f}'.format(0.00225 * 100.0)
'0.22'
>>> '{:.2f}'.format(0.225)
'0.23'
>>>  '{:.2f}'.format(round(0.00225 * 100.0, 10))
'0.23'
希望你能马上明白我为什么感到沮丧。我试图在GUI上显示
value*100.0
,将完整精度存储在单元格后面,但仅显示2个小数点(或用户精度设置的任何值)。GUI类似于Excel电子表格

我不希望丢失像
0.222244937645
这样的精度,并按
10
取整,但我也不希望像
0.00225*100.0
这样的值显示为
0.22

我感兴趣的是听到一种处理类似情况的标准方法,或者针对我的具体情况的补救方法。提前感谢您的帮助。

考虑使用,它“支持快速正确舍入的十进制浮点运算”。与您的用例相关的
十进制
的主要优点是:

  • 十进制数字可以精确表示。相反,像
    1.1
    2.2
    这样的数字在二进制浮点中没有精确的表示。最终用户通常不希望
    1.1+2.2
    显示为
    3.30000000000000003
    ,因为它使用二进制浮点

  • 精确性一直延续到算术中。在十进制浮点中,
    0.1+0.1+0.1-0.3
    正好等于零。在二进制浮点中,结果是
    5.5511151231257827e-017
    。接近于零时,差异会妨碍可靠的平等性测试,差异可能会累积。因此,在具有严格等式不变量的会计应用程序中,十进制是首选

根据您在问题中提供的信息,我不能说迁移到
十进制
需要多少大修。但是,如果您正在创建一个类似电子表格的应用程序,并且始终希望保持最大的精度,那么您可能希望重构以使用
Decimal
,以避免在面向用户的GUI中出现意外的数字

要获得所需的行为,您可能需要更改
十进制
实例的舍入模式(默认为
舍入半舍五入

from decimal import getcontext, ROUND_HALF_UP

getcontext().rounding = ROUND_HALF_UP

n = round(Decimal('0.00225') * Decimal('100'), 2)
print(n)  # prints Decimal('0.23')

m = round(Decimal('0.00225') * 100, 2)
print(m)  # prints Decimal('0.23')

也许用十进制?docs.python.org/2/library/decimal.html

from decimal import *
getcontext().prec = 2
n = Decimal.from_float(0.00225)
m = n * 100
print(n, m)
print(m.quantize(Decimal('.01'), rounding=ROUND_DOWN))
print(m.quantize(Decimal('.01'), rounding=ROUND_UP)

你好谢谢你提供关于十进制的信息。不幸的是,
'{.2f}。格式(十进制(0.00225*100))
导致
0.22
'{.2f}。格式(十进制(十进制('0.00225')*十进制('100'))
产生相同的结果请通读
十进制
模块的所有文档。您需要更改
Decimal
实例的舍入模式。我已经用细节编辑了我的答案。@Riptyde4有帮助吗?看起来到目前为止它一直在工作,是的。非常感谢。仍在计算结果此操作返回
0.22
,所需结果为
0.23
,然后进行四舍五入,如果进行四舍五入,则为0.23