分析
Javascript的只有一种类型的数字型数,并在Javascript中所有的数字都在IEEE-754标准格式表示,浮点数的准确性问题不是Javascript独特的,因为在二进制表示的十进制数是无限的了。
十进制二进制
0.1 0.0001100110011001…
0.2 0.0011001100110011…
0.3 0.0100110011001100…
0.4 0.0110011001100110…
0.5 0.1
0.6 0.1001100110011001…
例如,1.1,程序实际上不能表示1.1,但只能达到一定的精度,这是不可避免的精度损失:
一点零九九九九九九九九九九九九九九九
Javascript中的问题比较复杂,这里只给出了一些测试数据:
输入和输出
1.0-0.9 = 0.1假
1.0-0.8 = 0.2假
1.0-0.7 = 0.3假
1.0-0.6 = 0.4真实
1.0-0.5 = 0.5真实
1.0-0.4 = 0.6真实
1.0-0.3 = 0.7真实
1.0-0.2 = 0.8真实
1.0-0.1 = 0.9真实
解决
你如何避免这种1.0-0.9!= 0.1非bug问题下面给出了一个更广泛使用的解决方案。在判断浮点数运算结果之前,计算的精度会被缩小,因为在减少精度的过程中,总有四轮五个条目。
复制代码代码如下所示:
(1.0-0.9)。ToFixed(数字)(固定) / /精度参数应在0和20之间
ParseFloat((1.0-0.9)。ToFixed(10))= 0.1 / /真实的结果
ParseFloat((1.0-0.8)。ToFixed(10))= 0.2 / /真实的结果
ParseFloat((1.0-0.7)。ToFixed(10))= 0.3 / /真实的结果
ParseFloat((11.0-11.8)。ToFixed(10))= 0.8 / /真实的结果
法精炼
复制代码代码如下所示:
确定的值等于 / /相等的方法
(number1,number2函数相等,数字){
数字=数字=未定义的10:数字;默认精度为10。
返回number1.tofixed(位数)= number2.tofixed(数字);
}
IsEqual(1.0-0.7,0.3); / /返回true
/本机扩展模式,更多的面向对象的风格
number.prototype.isequal =功能(号码位数){
数字=数字=未定义的10:数字;默认精度为10。
返回this.tofixed(位数)= number.tofixed(数字);
}
(1.0-0.7)。IsEqual(0.3); / /返回true