Python 为什么';打印';可以给出一个精确的值,而其他的则不能?
这似乎很清楚,但为什么当我使用Python 为什么';打印';可以给出一个精确的值,而其他的则不能?,python,python-2.7,math,Python,Python 2.7,Math,这似乎很清楚,但为什么当我使用print时,答案不是0.150000000000002?首先,浮点数学并不精确,因为大多数浮点数字不能用float精确表示 因此,0.1+0.15的值并不完全是0.25,而是一些非常接近它的数字 print给出一个看似精确的结果的原因是,它使用str来获得结果,这是一种用户友好的字符串表示形式 >>> 0.1 + 0.05 0.15000000000000002 另一方面,Python解释器使用repr,这为您提供了as代码字符串表示: &g
print
时,答案不是0.150000000000002
?首先,浮点数学并不精确,因为大多数浮点数字不能用float
精确表示
因此,0.1+0.15
的值并不完全是0.25
,而是一些非常接近它的数字
print
给出一个看似精确的结果的原因是,它使用str
来获得结果,这是一种用户友好的字符串表示形式
>>> 0.1 + 0.05
0.15000000000000002
另一方面,Python解释器使用repr
,这为您提供了as代码字符串表示:
>>> str(0.1 + 0.05)
'0.15'
首先,浮点数学不是精确的,因为大多数浮点数字不能用
float
精确表示
因此,0.1+0.15
的值并不完全是0.25
,而是一些非常接近它的数字
print
给出一个看似精确的结果的原因是,它使用str
来获得结果,这是一种用户友好的字符串表示形式
>>> 0.1 + 0.05
0.15000000000000002
另一方面,Python解释器使用repr
,这为您提供了as代码字符串表示:
>>> str(0.1 + 0.05)
'0.15'
这是因为
print
在引擎盖下调用float的\uuu str\uuuuu
方法,出于某种原因,float上的\uu str\uuuu
进行舍入。这是因为print
在引擎盖下调用float的\uu str uuuuuu
方法,出于某种原因,float上的\uu str uuuuu
进行舍入。你说的是什么意思“当我使用打印时,答案不是0.150000000000002”?在这里。你说“当我使用打印时,答案不是0.150000000000002”是什么意思"? 它就在这里。你不会真的想让\uuuuu str\uuuuuuu
不旋转吧?如果没有任何舍入,1/100.0
将打印为0.010000000000208166817117216851132943093776702880859375
,例如。@MarkDickinson,这有什么错?你宁愿撒谎也不愿说实话?隐式舍入至少令人困惑。更不用说Python没有遵循它自己的禅宗:“显式比隐式好”。它的错误在于它为小浮点数或大浮点数生成了大量的数字。例如,为1e-300
存储的真值如果准确写入,则给出长度为756的字符串(750位、指数和小数点)。所以,是的,根据禅宗的精神:“实用战胜纯洁”,显示所有750个数字是不切实际的。你不会真的希望\uuuu str\uuuu
不舍入,是吗?如果没有任何舍入,1/100.0
将打印为0.010000000000208166817117216851132943093776702880859375
,例如。@MarkDickinson,这有什么错?你宁愿撒谎也不愿说实话?隐式舍入至少令人困惑。更不用说Python没有遵循它自己的禅宗:“显式比隐式好”。它的错误在于它为小浮点数或大浮点数生成了大量的数字。例如,为1e-300
存储的真值如果准确写入,则给出长度为756的字符串(750位、指数和小数点)。所以,是的,根据禅宗的精神:“实用战胜纯洁”,而且显示所有750个数字是不切实际的。