gpt4 book ai didi

python - 为什么0.1有时能准确打印,有时却不能?

转载 作者:行者123 更新时间:2023-12-03 08:03:21 25 4
gpt4 key购买 nike

我跑:

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

为什么直接打印数字就可以了,但是使用运算符-会得到意想不到的值?

我检查过: Is floating point math broken?

如果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 可以执行这种操作?它会让我们对“ float 学被破坏了吗?”感到非常困惑

最佳答案

因为数字不相等。当您传递 float 时,请考虑以下事项直接联系Decimal更好地了解正在发生的事情:

>>> from decimal import Decimal
>>> Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> Decimal(0.5 - 0.4)
Decimal('0.09999999999999997779553950749686919152736663818359375')

请注意,您从文字 0.1 获得的实际浮点值与从文字 0.5 创建的 float 相减的结果不同和0.4 。这是因为两个文字也可能有错误(注意,0.5 可以精确表示,因为它可以表示为 2 的幂)。

>>> Decimal(0.5)
Decimal('0.5')
>>> Decimal(0.4)
Decimal('0.40000000000000002220446049250313080847263336181640625')

请注意,当您打印数字时,Python 打印的字符串更多的是近似值,尽管Python使用的算法应该生成可以可靠地重现的最短表示形式来自文字的实际浮点值:

>>> 0.5 - 0.4
0.09999999999999998
>>> Decimal(0.09999999999999998)
Decimal('0.09999999999999997779553950749686919152736663818359375')
>>> Decimal(0.5 - 0.4)
Decimal('0.09999999999999997779553950749686919152736663818359375')

注意,我能想到的几乎所有语言都使用实际在硬件中表示的 float 的截断形式。如果您想查看更多内容,通常必须使用字符串格式。

关于python - 为什么0.1有时能准确打印,有时却不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73200049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com