首页
学习
活动
专区
工具
TVP
发布

JS魔法堂:彻底理解0.1 + 0.2 === 0.30000000000000004的背后

在浮点数运算中产生误差值的示例中,最出名应该是0.1 + 0.2 === 0.30000000000000004了,到底有多有名?...1. 0.1 的二进制表示为 1.1001100110011001100110011001100110011001100110011001 1(0011)+ * 2^-4;   2....当64bit的存储空间无法存储完整的无限循环小数,而IEEE 754 Floating-point采用round to nearest, tie to even的舍入模式,因此0.1实际存储时的位模式是...     若需要复杂且全面的运算功能那必须上math.js,其内部引用了decimal.js和fraction.js。...Solution 0x02 - D.js D.js算是我的练手项目吧,截止本文发表时D.js版本为V0.2.0,仅实现了加、减、乘和整除运算而已,bug是一堆堆的,但至少解决了0.1+0.2的问题了。

1.3K60

为什么「0.1+0.2!=0.3」,而「0.1+0.3==0.4」

浮点数运算就是这样一个问题,每个人都知道浮点数运算有精度损失,但是为什么「0.1+0.2!=0.3」,而「0.1+0.3==0.4」: float 除了含含糊糊的精度损失,你能给出更有营养的解释么?...无非就是十进制的「1/2 + 1/4 + 1/8 + 1/16 + 1/32 + 1/64 + 1/128」,不过细心的你可能已经发现问题了,计算机这种处理小数的方式存在精度损失的,比如一个十进制的「0.1...下面看看为什么「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.3」近似等于二进制「0.01001」 十进制的「0.4...」近似等于二进制「0.01100」 于是,十进制的「0.1 + 0.3」也就是二进制的「0.00011 + 0.01001」: 0.00011 + 0.01001 --------- 0.01100

73120
您找到你想要的搜索结果了吗?
是的
没有找到

0.1+0.2!=0.3的分析

现象 我们在js中进行如下运算时 console.log(0.1+0.2) // 结果0.30000000000000004 而不是0.3 1 可以看到0.1 + 0.2 !...JS中采用的IEEE 754的双精度标准也是一样的道理在存储空间有限的情况下,当出现这种无法整除的小数的时候就会取一个近似值,在js中如果这个近似值足够近似,那么js就会认为他就是那个值。...(中间15个0,js会认为两个值足够近似,所以输出0.1) 1234 由于0.1转换成二进制时是无限循环的,所以在计算机中0.1只能存储成一个近似值。...重点来了 在0.1 + 0.2这个式子中,0.1和0.2都是近似表示的,在他们相加的时候,两个近似值进行了计算,导致最后得到的值是0.30000000000000004,此时对于JS来说,其不够近似于0.3...0.1+0.2 => (0.1*10+0.2*10)/10 1

56930

0.1 和 0.10 一样吗?

表妹一下急了,老师明明说0.1里1的后面无论有多少个0都是一样的! 小编没忍住,就提前给她上了一课! 0.1和0.10一样吗? 如果我们只学了精确小数,那这个问题会显得很多余。...因为在精确小数里: 0.1=1/10,0.10=10/100,但将分数10/100约简,就是1/10。所以这两者的值是完全一样的。...在四舍五入取近似值时,小数0.1也许是从0.05用“五入”得到的,也可能是从0.14用“四舍”得到的。因此,近似小数0.1就表示它的准确值在大于或等于0.05到小于0.15之间。...用x表示它的准确值,那么,0.095≤x<0.105,它的范围要比0.1小得多了。 所以在近似小数里,0.1和0.10的差别就大了。...0.1和0.10在数值上是一样大的,但是却不完全一样。

1.1K30
领券