JavaScript的浮点数计算问题
2014-01-08 17:48
295 查看
在JavaScript中执行 0.1 + 0.2 == 0.3,结果为false,为什么呢?
之前总认为浮点数运算是因为位数不够,所以不能精确,但0.1和0.2明显位数不多呀?
浮点数 123.11 用浮点表示就是 1.2311*10^2,即1.2311向坐移动两位
那么0.1 不就可以表示成1*10^(-1)么,基数是1,偏移量是-1,只要用二进制的浮点数的基数和偏移量分别表示出来不就可以精确的表示了么,为什么计算还是有误差呢?
哈哈,有没有发现错误呀??
错误点在1*10^(-1),这些偏移量是十进制中的偏移,相当于乘以进制10,那么二进制中的偏移就要乘以2(或者除以2)
所以二进制的 1,向左偏移一位就是除以2,实际上是十进制的0.5(1/2),再偏移一位就是0.25(1/4),继续偏移是0.125(1/8),
那有没有一个二进制的数,偏移后刚好等于0.1呢?
这就相当于问有没有一个整数,被2^n除了之后刚好得0.1
反过来来算一下,
n = 1,原数是0.1
n = 2,原数是0.4
n = 3,原数是0.8
n = 4,原数是1.6
n = 5,原数是3.2
n = 6,原数是4.8
没有一个是整数,所以不存在一个二进制浮点数,能够精确的表示0.1
这并不是JavaScript的问题,所有采用二进制的浮点数都存在相同问题。
之前总认为浮点数运算是因为位数不够,所以不能精确,但0.1和0.2明显位数不多呀?
浮点数 123.11 用浮点表示就是 1.2311*10^2,即1.2311向坐移动两位
那么0.1 不就可以表示成1*10^(-1)么,基数是1,偏移量是-1,只要用二进制的浮点数的基数和偏移量分别表示出来不就可以精确的表示了么,为什么计算还是有误差呢?
哈哈,有没有发现错误呀??
错误点在1*10^(-1),这些偏移量是十进制中的偏移,相当于乘以进制10,那么二进制中的偏移就要乘以2(或者除以2)
所以二进制的 1,向左偏移一位就是除以2,实际上是十进制的0.5(1/2),再偏移一位就是0.25(1/4),继续偏移是0.125(1/8),
那有没有一个二进制的数,偏移后刚好等于0.1呢?
这就相当于问有没有一个整数,被2^n除了之后刚好得0.1
反过来来算一下,
n = 1,原数是0.1
n = 2,原数是0.4
n = 3,原数是0.8
n = 4,原数是1.6
n = 5,原数是3.2
n = 6,原数是4.8
没有一个是整数,所以不存在一个二进制浮点数,能够精确的表示0.1
这并不是JavaScript的问题,所有采用二进制的浮点数都存在相同问题。
相关文章推荐
- 解决javascript中的浮点数计算不精确问题
- js计算出现多位小数-Javascript 浮点运算问题分析与解决
- Javascript 浮点计算问题分析与解决
- javascript 浮点数加减乘除计算会有问题, 整理了以下代码来规避这个问题
- Java 浮点数计算问题
- JavaScript中float的减法与乘法计算错误问题
- 关于JavaScript中计算精度丢失的问题
- javascript中float类型计算的精确度问题
- 关于JavaScript中计算精度丢失的问题
- js浮点数精度问题(js计算中遇到的坑)
- JavaScript 浮点数计算
- java浮点计算精度丢失问题
- javascript 浮点计算
- javascript 二进制浮点数的问题,0.3-0.2不等于0.1
- Java浮点数float和double精确计算的精度误差问题总结
- JavaScript浮点运算的精度问题
- MySQL浮点计算存在的问题与解决方案
- js 浮点数计算精度不准确问题
- Javascript中小数精确计算问题
- JavaScript浮点运算的问题