浮点格式的Python精度问题
请看我在Python 3.6解释器中输入的以下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' 希望你能马上
>>> 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