浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源
在知乎上上看到如下问题:
浮点数精度问题的前世今生?
1.该问题出现的原因 ?
2.为何其他编程语言,比如java中可能没有js那么明显
3.大家在项目中踩过浮点数精度的坑?
4.最后采用哪些方案规避这个问题的?
5.为何采用改方案?
例如在 chrome js console 中:alert(0.7+0.1); //输出0.7999999999999999
之前自己答的不是满意(对 陈嘉栋的回答 还是满意的),想对这个问题做个深入浅出的总结
再看到这几篇长文《[ JS 基础 ] JS 浮点数四则运算精度丢失问题 (3)》、《JavaScript数字精度丢失问题总结》、《细说 JavaScript 七种数据类型》,略有所悟,整理如下:
这个问题并不只是在Javascript中才会出现,任何使用二进制浮点数的编程语言都会有这个问题,只不过在 C++/C#/Java 这些语言中已经封装好了方法来避免精度的问题,而 JavaScript 是一门弱类型的语言,从设计思想上就没有对浮点数有个严格的数据类型,所以精度误差的问题就显得格外突出。
浮点数丢失产生原因
JavaScript 中的数字类型只有 Number 一种,Number 类型采用 IEEE754 标准中的 “双精度浮点数” 来表示一个数字,不区分整数和浮点数 (js位运算或许是为了提升B格)。
几乎所有的编程语言浮点数都是都采用IEEE浮点数算术标准。java float 32 浮点数: 1bit符号 8bit指数部分 23bit尾数。推荐阅读《JAVA 浮点数的范围和精度》
什么是IEEE-745浮点数表示法
IEEE-745浮点数表示法是一种可以精确地表示分数的二进制示法,比如1/2,1/8,1/1024