JavaScript实验:浮点数计算

与所有其它现代编程语言一样,JavaScript是用二进制来表示浮点数的,因此其所能精确表示的数仅止于以2的指数为分母的分数(比如1/2, 3/4以及1/1024等等)。对于其它的浮点数,JavaScript只能用二进制来模拟并以极度接近的值来替代。比如,0.3-0.2的结果就并不是精确的0.1,而是一个极度接近0.1的小数。

由于结果足够接近,因此上述这一局限性在处理普通的十进制运算时问题并不大;唯一会出现问题的场景在于,当将这种不精确的计算结果用于比较时:

var x = 0.8-0.7;  
var y = 0.3-0.2;  
console.log(x == y);//false  

当需要对小数计算的结果进行比较时(比如,各类金融领域的计算),一个可行的解决方案是更换单位,将小数转换为整数后再进行操作(比如,将所有的数值转换成以分甚至厘等最小计量单位后再进行计算):

var a = 0.8*10 - 0.7*10;  
var b = 0.3*10 - 0.2*10;  
console.log(a == b);//true  

本文实验代码: http://jsfiddle.net/cshao/v9Sdn/