栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么4 * 0.1的浮点值在Python 3中看起来不错,而3 * 0.1却没有?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么4 * 0.1的浮点值在Python 3中看起来不错,而3 * 0.1却没有?

简单的答案是

3*0.1 != 0.3
由于量化(舍入)误差(而
4*0.1 == 0.4
乘以2的幂通常是“精确”运算)。Python试图找到
最短的字符串并将其舍入为所需的值 ,因此它可以显示
4*0.1
0.4
相等,但不能显示
3*0.1
为,
0.3
因为它们不相等。

您可以

.hex
在Python中使用该方法查看数字的内部表示形式(基本上是 确切的 二进制浮点值,而不是以10为底的近似值)。这可以帮助解释幕后情况。

>>> (0.1).hex()'0x1.999999999999ap-4'>>> (0.3).hex()'0x1.3333333333333p-2'>>> (0.1*3).hex()'0x1.3333333333334p-2'>>> (0.4).hex()'0x1.999999999999ap-2'>>> (0.1*4).hex()'0x1.999999999999ap-2'

0.1是0x1.999999999999a乘以2 ^ -4。末尾的“ a”表示数字10-换句话说,二进制浮点数中的0.1 略大于
“精确”值0.1(因为最终的0x0.99舍入为0x0.a)。当您将其乘以4(2的幂)时,指数会上移(从2 ^ -4到2 ^
-2),但数字不变,所以

4*0.1 == 0.4


但是,当乘以3时,0x0.99与0x0.a0(0x0.07)之间的微小差异会放大为0x0.15错误,在最后一个位置显示为一位错误。这导致0.1 * 3
略大于 0.3的舍入值。

Python 3的float

repr
被设计为可 双向访问的 ,也就是说,显示的值应完全可转换为原始值(
float(repr(f)) ==f
对于所有float
f
)。因此,它无法显示
0.3
0.1*3
完全相同的方式,或两个 不同的 数字最终会往返后相同。因此,Python
3的
repr
引擎选择显示一个带有轻微的明显错误的引擎。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/633695.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号