js小数计算如何保证得到正确的值?
alert(0.3 - (0.1 + 0.2));
喵了个咪的,竟然等于-5.551115123125783e-17
有什么办法可以优雅的解决这种语言自身的bug吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
alert(0.3 - (0.1 + 0.2));
喵了个咪的,竟然等于-5.551115123125783e-17
有什么办法可以优雅的解决这种语言自身的bug吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(6)
原因
1.首先我们要知道,这个误差并非是javascript的误差,这是一个数学问题,通过离散数学碰撞来模拟造成的必然结果!或者说应该是硬件先天性缺陷导致无法规避这个问题吧。
2.如果我没记错,所有采用 IEEE 754[1] 的实现的系统应该都会存在这个问题,无论是java还是python ... etc.
3.好吧,说实话,我也不太记得清楚了,可以参考下What Every Computer Scientist Should Know About Floating-Point Arithmetic
4.这个问题,我想说你是不是有点懒啊wiki,给予我们详细的解释了
解决办法
思路:
1.解决的思路无非是转换成整数计算,即先乘一个大的数再除去一个数,因为计算误差是由浮点运算引起的
2.这里我又想说你懒惰了,万能的google,这里绝对可以帮到你?
好吧,纵容你这次,我这里直接给出链接:
博客园的js浮点运算bug的解决办法summary
1.提问的人很懒,我很勤快 XD
2.IEEE这规范不要求熟记,尼玛,大概看看总没问题吧,好吧我也讨厌这货,长篇大论,但是我大概还是有点印象的,好吧,具体多少对应什么问题,我貌似没记清楚,后来查了下
3.这里你起码好好的了解下IEEE 754,食物喂到这里了,点进去看看没问题吧
也不能算bug吧,某些小数因为浮点数二进制表示法的固有缺陷,是无法避免的。所以在银行等敏感的系统中,一般0.1美元都会表示成10美分,即尽量使用整数。
如果需要比较两个浮点数表达式是否相同的话,可以采取以下方法:
以前用过,目前还没遇到过大问题 代码地址https://gist.github.com/369679209/4fb71c02fc16c41b475c
不涉及乘除的话,可以给每个数乘100,然后再计算,结果除100
Javascript的浮点数精度本来就不高,所以计算的时候出现较大的误差是很正常的。
一般进行浮点运算都会有个精度要求,比如精确到小数点后两位,那么你那段程序就可以写成
看了很多人的博客,描述得很精妙。
但是,我还是推荐,没有时间深究的时候,还是要站在巨人的肩膀上把。
Math.js、decimal.js、big.js,推荐这3个数学库。