数码资讯
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,程序实际上不能表
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
十进制二进制
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
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
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。