js 小数运算问题

来源:互联网 发布:苹果自制铃声软件 编辑:程序博客网 时间:2024/05/01 12:46

问题:

在写简单计算器时遇到过,把字符串解析成浮点数算减法,得到过 这样的结果 5-3.2=1.7999999999999998,很奇怪。

部分代码如下:

case "-":            s=parseFloat(t1)-parseFloat(t2);            break;

原因:

java和JavaScript中计算小数运算时,都会先将十进制的小数换算到对应的二进制,一部分小数并不能完整的换算为二进制,这里就出现了第一次的误差。待小数都换算为二进制后,再进行二进制间的运算,得到二进制结果。然后再将二进制结果换算为十进制,这里通常会出现第二次的误差。

十进制数字 8,用二进制表示为 100

可以理解为 1*2^2+0*2^1+0*2^0 = 8

那么小数部分怎么表示?
十进制数字 0.5,用二进制表示为 0.1
可以理解为 0*2^0+1*(2^-1) = 0.5

十进制数字 0.25,用二进制表示为 0.01
可以理解为 0*2^0+0*(2^-1)+1*(2^-2) = 0.25

十进制数字 0.75,用二进制表示为 0.11
可以理解为 0*2^0+1*(2^-1)+1*(2^-2) = 0.75

好了,问题来了 怎么表示一个 介于 0.25~0.5 之间的数?

除不尽吧?无理数吧?对了,这就是浮点数不是刚刚好等于一个十进制浮点数的原因

解决方法:

要避免这种情况呢,通常可以将小数同时扩大相同10的整倍数,完成计算后,在去掉之前添加的整倍数。

部分代码如下:

case "-":            s=(parseFloat(t1*100)-parseFloat(t2*100))/100;



0 0
原创粉丝点击