当前位置: 首页 > 面试题库 >

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

吉玉石
2023-03-14
问题内容

我知道大多数小数都没有确切的浮点表示形式(浮点数学运算符是否损坏?。

但是我不明白为什么当两个值实际上都具有丑陋的十进制表示形式时,为什么不能4*0.1很好地打印为0.4,但3*0.1不是呢?

>>> 3*0.1
0.30000000000000004
>>> 4*0.1
0.4
>>> from decimal import Decimal
>>> Decimal(3*0.1)
Decimal('0.3000000000000000444089209850062616169452667236328125')
>>> Decimal(4*0.1)
Decimal('0.40000000000000002220446049250313080847263336181640625')

问题答案:

简单的答案是3*0.1 != 0.3由于量化(舍入)误差(而4*0.1 == 0.4乘以2的幂通常是“精确”运算)。Python试图找到
最短的字符串并将其舍入为所需的值 ,因此它可以显示4*0.10.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的floatrepr被设计为可 双向访问的 ,也就是说,显示的值应完全可转换为原始值(float(repr(f)) == f对于所有float f)。因此,它无法显示0.30.1*3完全相同的方式,或两个 不同的 数字最终会往返后相同。因此,Python
3的repr引擎选择显示一个带有轻微的明显错误的引擎。



 类似资料:
  • 本文向大家介绍0.1 + 0.2、0.1 + 0.3和0.1 * 0.2分别等于多少?并解释下为什么?相关面试题,主要包含被问及0.1 + 0.2、0.1 + 0.3和0.1 * 0.2分别等于多少?并解释下为什么?时的应答技巧和注意事项,需要的朋友参考一下 JS中采用的IEEE 754的双精度标准,计算机内部存储数据的编码的时候,导致精度变化。不是所有浮点数都有舍入误差。二进制能精确地表示位数有

  • 问题内容: 只要使用浮点,就无法在内存中精确表示0.1,因此我们知道该值通常为0.10000000000000004。 但是当使用去添加0.1和0.2。我得到0.3。 为什么0.3而不是0.30000000000000004出现? 问题答案: 这是因为在打印时(例如与包装一起),打印功能已经四舍五入到一定数量的小数位。 请参阅以下示例: 输出(在Go Playground上尝试): 首先,我们使用

  • 问题内容: 我必须将npm应用程序的版本从0.1更改为0.0.1,以使npm不能执行此操作。 为了完整性,这里是工作的json 出现错误时,版本以前是“ 0.1”。 这是某种需要3套版本号的API / ABI兼容性版本控制概念吗?为什么错误消息对此不友好? 问题答案: 是的,这对于语义版本控制是必需的,这是npm软件包使用的版本控制方案。这是来自的片段: 版本必须可由node-semver解析,该

  • 很长一段时间以来,我一直认为C比JavaScript快。然而,今天我制作了一个基准脚本来比较两种语言的浮点计算速度,结果令人惊叹! JavaScript似乎比C快近4倍! 我让这两种语言在我的i5-430M笔记本电脑上做同样的工作,执行了100000000次。C需要大约410毫秒,而JavaScript只需要大约120毫秒。 我真的不知道为什么JavaScript在这种情况下运行得这么快。有人能解

  • This plugin give you the opportunity of using the fade in/fade out giving the effect of an heart beat. In fact it looks a little bit like the apple on mac that is flashing when you close the cover. To

  • 问题内容: 如果我声明并看看,它不会给我。 因此,我必须使用以下重复(因而很糟糕)的样式构造: 例如,如果我想获得利润,是否真的需要使用它? 是我对Android或Java的误解,还是两者兼而有之? 问题答案: 我认为您对“ LayoutParams”的理解不正确。视图(或布局)必须是“父视图的LayoutParams”的实例。 例如,这是RelativeLayout中的LinearLayout。