1.首先我们要知道,这个误差并非是javascript的误差,这是一个数学问题,通过离散数学碰撞来模拟造成的必然结果!或者说应该是硬件先天性缺陷导致无法规避这个问题吧。
2.如果我没记错,所有采用 IEEE 754[1] 的实现的系统应该都会存在这个问题,无论是java还是python ... etc.
3.好吧,说实话,我也不太记得清楚了,可以参考下What Every Computer Scientist Should Know About Floating-Point Arithmetic
4.这个问题,我想说你是不是有点懒啊wiki,给予我们详细的解释了
巴扎黑 2017-04-10 14:38:445楼
原因
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,食物喂到这里了,点进去看看没问题吧
赞 +0添加回复
天蓬老师 2017-04-10 14:38:444楼
也不能算bug吧,某些小数因为浮点数二进制表示法的固有缺陷,是无法避免的。所以在银行等敏感的系统中,一般0.1美元都会表示成10美分,即尽量使用整数。
如果需要比较两个浮点数表达式是否相同的话,可以采取以下方法:
赞 +0添加回复
怪我咯 2017-04-10 14:38:443楼
以前用过,目前还没遇到过大问题 代码地址https://gist.github.com/369679209/4fb71c02fc16c41b475c
赞 +0添加回复
巴扎黑 2017-04-10 14:38:442楼
不涉及乘除的话,可以给每个数乘100,然后再计算,结果除100
赞 +0添加回复
伊谢尔伦 2017-04-10 14:38:441楼
Javascript的浮点数精度本来就不高,所以计算的时候出现较大的误差是很正常的。
一般进行浮点运算都会有个精度要求,比如精确到小数点后两位,那么你那段程序就可以写成
赞 +0添加回复