-
-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[js] 第23天 0.1 + 0.2、0.1 + 0.3和0.1 * 0.2分别等于多少?并解释下为什么? #80
Comments
JS中采用的IEEE 754的双精度标准,计算机内部存储数据的编码的时候,导致精度变化。不是所有浮点数都有舍入误差。二进制能精确地表示位数有限且分母是2的倍数的小数(这种情况的小数像乘法0.1*0.2的出五十分之一就不能精确)。 |
用一句话概括就是:
这个问题也算是经常遇到的面试题之一了,楼上说的对,简单来说就是js中采用IEEE754的双精度标准,因为精度不足导致的问题,比如二进制表示0.1时这这样表示
那么同样的,0.2 在二进制也是无限循环的,被裁剪后也失去了精度变成了
由此我们可以得出:
所以自然
参考: |
0.30000000000000004 EcmaScrpt规范定义Number的类型遵循了IEEE754-2008中的64位浮点数规则定义的小数后的有效位数至多为52位导致计算出现精度丢失问题! 一般使用(0.1 + 0.2 - 0.3 )< Number.EPSILON来解决 |
先说结果: 之所以会出现 说的再简单些: 我们可以把计算机转换二进制存储的过程类比成下面的问题: 当我们把
|
JS中采用的IEEE 754的双精度标准,计算机内部存储数据的编码的时候,导致精度变化。不是所有浮点数都有舍入误差。二进制能精确地表示位数有限且分母是2的倍数的小数(这种情况的小数像乘法0.1*0.2的出五十分之一就不能精确)。 |
(0.2 * 1e20 + 0.3 * 1e20)/1e20 |
0.30000000000000004 |
mark js采用的双精度标准,遵循了IEEE754-2008中的64位浮点数规则定义的小数后的有效位数至多为52位,这导致计算出现精度丢失问题。 |
您好!我看到邮件后会立即联系您!
|
除了含含糊糊的精度损失,你能给出更有营养的解释么?让我们看看到底是为什么! 首先,让我们举一个整数的例子,比如: 十进制「13」:1*(10�^1) + 3(10^0) = 10 + 3 = 13 十进制「0.625」:6*(10^-1) + 2*(10^-2) + 5*(10^-3) = 0.625 下面看看为什么「0.1 + 0.2 != 0.3」,而「0.1 + 0.3 == 0.4」。既然存在精度损失,那么「0.1 + 0.2 != 0.3」也说得过去,我们推算一下为什么「0.1 + 0.3 == 0.4」: 十进制的「0.1」近似等于二进制「0.00011」 |
您好!我看到邮件后会立即联系您!
|
0.1 + 0.2 !== 0.3 // 0.30000000000000004
0.1 + 0.3 === 0.4 // 0.4
0.1 * 0.2 !== 0.02 // 0.020000000000000004 js 采用 IEEE 双精度64位浮点数来保存数字,由于长度有限,所以对于数据的舍入有误差。 |
您好!我看到邮件后会立即联系您!
|
第23天 0.1 + 0.2、0.1 + 0.3和0.1 * 0.2分别等于多少?并解释下为什么?
The text was updated successfully, but these errors were encountered: