I run:
print(0.1)
print(0.2)
print(0.3)
print(0.4)
print(0.5)
print(0.5-0.4)
print(0.4-0.3)
print(0.3-0.2)
print(0.2-0.1)
表明:
0.1
0.2
0.3
0.4
0.5
0.09999999999999998
0.10000000000000003
0.09999999999999998
0.1
为什么直接打印数字可以,但是使用运算符-
会得到意想不到的价值吗?
我检查过:浮点数学有问题吗?
If 0.5-0.4
无法精确保存在硬件中,为什么打印(0.1)会显示0.1而不是0.10000000000xxx?
也许更明确的说法是:
根据我的理解,python 应该 print(0.1) 为 0.10000000000xxx,而 0.5-0.4 应该等于 0.4-0.3 并等于 0.3-0.2,对吧?
为什么Python可以“Python通过显示舍入值来保持位数的可管理性”?如果python想要print(0.1)为0.1,那么它应该将0.4-0.3视为0.1,对吗?为什么Python希望我们在这类话题上感到困惑?
为了更精确地说明这个问题“不是”,真正认为 0.5-0.4 != 0.4-0.3。我的主要问题是 print(0.1)= 0.1 而不是 0.10000000000xxxx,为什么 python 可以执行这种操作?它会让我们对“浮点数学坏了吗?”感到非常困惑。
Because 数字不相等。当您通过float
直接到Decimal
为了更好地表示正在发生的事情:
>>> from decimal import Decimal
>>> Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> Decimal(0.5 - 0.4)
Decimal('0.09999999999999997779553950749686919152736663818359375')
请注意,您从文字中获得的实际浮点值0.1
与从文字中创建的浮点数相减的结果不同0.5
and 0.4
。这是因为这两个字面量也会有错误 (note, 0.5
可以精确地表示,因为它可以表示为 2 的幂)。
>>> Decimal(0.5)
Decimal('0.5')
>>> Decimal(0.4)
Decimal('0.40000000000000002220446049250313080847263336181640625')
注意,string当你打印一个数字时,python打印的是甚至更多的是近似值,尽管 Python 使用的算法应该生成最短的表示形式,可以可靠地从文字中重现实际的浮点值:
>>> 0.5 - 0.4
0.09999999999999998
>>> Decimal(0.09999999999999998)
Decimal('0.09999999999999997779553950749686919152736663818359375')
>>> Decimal(0.5 - 0.4)
Decimal('0.09999999999999997779553950749686919152736663818359375')
请注意,我能想到的几乎所有语言都使用实际在硬件中表示的浮点数的截断形式。如果你想看到更多,通常必须使用字符串格式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)