JS和Java计算小数bug
2018-02-26 00:00
1041 查看
js计算小数时会有一些失真的问题,比较典型的:
7 * 0.8 = 5.6000000000000005
0.1 + 0.2 = 0.30000000000000004
问题原因推导: http://www.barretlee.com/blog/2016/09/28/ieee754-operation-in-js/
解决思路1:将浮点数转化成整数去计算,然后再转成浮点数。
解决思路2:引入Numeral.js,浮点数乘法、减法、格式化等功能完善(http://numeraljs.com/)
使用第三方扩展比如:BigNumber.js、Big.js、Decimal.js。兼顾运算速度与体积,最佳是Big.js。 jsperf地址:https://jsperf.com/bignumber-js-vs-big-js-vs-decimal-js
解决思路3:可以搜索到的, 各种运算辅助函数。
刚看了篇文章,发现java做浮点计算的时候也会遇到这类问题:
参考:http://www.jb51.net/article/105498.htm,讲的非常棒,清晰明了
解决办法:
在《Effective Java》中提到一个原则,那就是float和double只能用来作科学计算或者是工程计算,但在商业计算中我们要用java.math.BigDecimal,通过使用BigDecimal类可以解决上述问题,首先需要注意的是,直接使用字符串来构造BigDecimal是绝对没有精度损失的,如果用double或者把double转化成string来构造BigDecimal依然会有精度损失,所以我觉得这种解决方法就是在使用中就把浮点数用string来表示存放,涉及到运算直接用string构造double,否则肯定会有精度损失。
7 * 0.8 = 5.6000000000000005
0.1 + 0.2 = 0.30000000000000004
问题原因推导: http://www.barretlee.com/blog/2016/09/28/ieee754-operation-in-js/
解决思路1:将浮点数转化成整数去计算,然后再转成浮点数。
解决思路2:引入Numeral.js,浮点数乘法、减法、格式化等功能完善(http://numeraljs.com/)
使用第三方扩展比如:BigNumber.js、Big.js、Decimal.js。兼顾运算速度与体积,最佳是Big.js。 jsperf地址:https://jsperf.com/bignumber-js-vs-big-js-vs-decimal-js
解决思路3:可以搜索到的, 各种运算辅助函数。
刚看了篇文章,发现java做浮点计算的时候也会遇到这类问题:
参考:http://www.jb51.net/article/105498.htm,讲的非常棒,清晰明了
解决办法:
在《Effective Java》中提到一个原则,那就是float和double只能用来作科学计算或者是工程计算,但在商业计算中我们要用java.math.BigDecimal,通过使用BigDecimal类可以解决上述问题,首先需要注意的是,直接使用字符串来构造BigDecimal是绝对没有精度损失的,如果用double或者把double转化成string来构造BigDecimal依然会有精度损失,所以我觉得这种解决方法就是在使用中就把浮点数用string来表示存放,涉及到运算直接用string构造double,否则肯定会有精度损失。
相关文章推荐
- js,java小数计算精度问题
- js-计算保留小数点一两位并避免出现无限小数的bug
- 如何在js中精确除法计算并保留两位小数(不丢失精度)java针对于BigDecimal类型
- java,js中保留小数的经典写法
- java计算的小数加减法计算有错误解决
- Java精确计算小数
- JAVA 及 js 浮点数精确计算
- js 和 java 有小数的运算 注意事项
- Java中计算百分比的方式以及js中
- js 小数点计算 BUG 解决办法
- 【Bug笔记】关于Js的返回事件和Java中NoSuchMethodException
- 网上出现的js小数计算的除法优化
- 解决JS浮点数(小数)计算加减乘除的BUG
- java计算小数时保留两位小数,不采用四舍五入
- js 浮点小数计算精度问题 parseFloat 精度问题
- java,中双精度double控制保留两位小数,js控制两位小数
- js相除出现浮点(JS浮点计算BUG屏蔽)
- java精度计算代码,指定精确小数位
- js中的小数计算精度问题,修正计算精度
- 利用java、js或mysql计算高德地图中两坐标之间的距离