JS无法进行数值精确计算的问题
2017-09-04 19:46
501 查看
在做js浮点型数值计算的时候,出现的了数据计算不准确的原因:
在有限的存储空间下,绝大部分的十进制小数都不能用二进制浮点数来精确表示。例如,0.1
这个简单的十进制小数就不能用二进制浮点数来表示。
console.log( 1 - 0.8 ); //输出 0.19999999999999996
console.log( 6 * 0.7 ); //输出 4.199999999999999
console.log( 0.1 + 0.2 ); //输出 0.30000000000000004
console.log( 0.1 + 0.7 ); //输出 0.7999999999999999
console.log( 1.2 / 0.2 ); //输出 5.999999999999999
通过上面举出的例子可以看到,原生的js运算结果不一定准确,会丢失精度。
解决方案 :将浮点数乘以(扩大)10的n次方倍,把浮点数变为整数后再进行相应的运算,最后将得到的结果除以(缩小)10的n次方倍。
console.log( (1*10 - 0.8*10)/10 ); //输出 0.2
console.log( 6 * 0.7*10/10 ); //输出 4.2
console.log( (0.1*10 + 0.2*10)/10 ); //输出 0.3
console.log( (0.1 *10+ 0.7*10)/10 ); //输出 0.8
console.log( 1.2 *10/(0.2 *10) ); //输出
6
在有限的存储空间下,绝大部分的十进制小数都不能用二进制浮点数来精确表示。例如,0.1
这个简单的十进制小数就不能用二进制浮点数来表示。
console.log( 1 - 0.8 ); //输出 0.19999999999999996
console.log( 6 * 0.7 ); //输出 4.199999999999999
console.log( 0.1 + 0.2 ); //输出 0.30000000000000004
console.log( 0.1 + 0.7 ); //输出 0.7999999999999999
console.log( 1.2 / 0.2 ); //输出 5.999999999999999
通过上面举出的例子可以看到,原生的js运算结果不一定准确,会丢失精度。
解决方案 :将浮点数乘以(扩大)10的n次方倍,把浮点数变为整数后再进行相应的运算,最后将得到的结果除以(缩小)10的n次方倍。
console.log( (1*10 - 0.8*10)/10 ); //输出 0.2
console.log( 6 * 0.7*10/10 ); //输出 4.2
console.log( (0.1*10 + 0.2*10)/10 ); //输出 0.3
console.log( (0.1 *10+ 0.7*10)/10 ); //输出 0.8
console.log( 1.2 *10/(0.2 *10) ); //输出
6
相关文章推荐
- 14、Java中用浮点型数据Float和Double进行精确计算时的精度问题
- Python中使用django框架进行web开发,模板中无法导入css、js和图片的问题解决
- JS计算浮点数加减乘除精确数值的方法
- Java中用浮点型数据Float和Double进行精确计算时的精度问题
- Java中用浮点型数据Float和Double进行精确计算时的精度问题
- js数值计算时使用parseInt进行数据类型转换(jquery)
- 浮点数进行精确计算的问题
- 埃尔米特插值问题——用Python进行数值计算
- 金融类app各种数值的精确计算问题
- Java中用浮点型数据Float和Double进行精确计算时的精度问题
- js关于精确计算和数值格式化,直接引js文件
- JS的toFixed方法设置小数点位数后再进行计算,数据出错问题
- 使用math.js进行javascript精确计算
- js关于精确计算和数值格式化以及直接引js文件
- js关于精确计算和数值格式化以及直接引js文件
- Java中浮点型数据Float和Double进行精确计算的问题
- [导入]js 浮点运算表达式 精确计算(vb没有这个问题)
- js:数组重排序问题:如何使用sort()方法按数值的大小进行升序或降序排列
- js数值计算时使用parseInt进行数据类型转换(jquery)
- js 数值计算问题