Javascript 浮点运算问题
来源:互联网 发布:网络域名怎么注册 编辑:程序博客网 时间:2024/05/02 01:58
分析:JavaScript 只有一种数字类型 Number
,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的。 浮点数的精度问题不是JavaScript特有的,因为有些小数以二进制表示位数是无穷的(原文来自):
十进制 二进制0.1 0.0001 1001 1001 1001 ...0.2 0.0011 0011 0011 0011 ...0.3 0.0100 1100 1100 1100 ...0.4 0.0110 0110 0110 0110 ...0.5 0.10.6 0.1001 1001 1001 1001 ...
所以比如 1.1
,其程序实际上无法真正的表示 ‘1.1’,而只能做到一定程度上的准确,这是无法避免的精度丢失:
1.09999999999999999
在JavaScript中问题还要复杂些,这里只给一些在Chrome中测试数据:
输入 输出1.0-0.9 == 0.1 False1.0-0.8 == 0.2 False1.0-0.7 == 0.3 False1.0-0.6 == 0.4 True1.0-0.5 == 0.5 True1.0-0.4 == 0.6 True1.0-0.3 == 0.7 True1.0-0.2 == 0.8 True1.0-0.1 == 0.9 True
解决:那如何来避免这类 ` 1.0-0.9 != 0.1 ` 的非bug型问题发生呢?下面给出一种目前用的比较多的解决方案, 在判断浮点运算结果前对计算结果进行精度缩小,因为在精度缩小的过程总会自动四舍五入
(1.0-0.9).toFixed(digits) // toFixed() 精度参数须在 0 与20 之间parseFloat((1.0-0.9).toFixed(10)) === 0.1 // 结果为TrueparseFloat((1.0-0.8).toFixed(10)) === 0.2 // 结果为TrueparseFloat((1.0-0.7).toFixed(10)) === 0.3 // 结果为TrueparseFloat((11.0-11.8).toFixed(10)) === -0.8 // 结果为True
方法提炼:
//原生扩展方式,更喜欢面向对象的风格,通过isEqual工具方法判断数值是否相等Number.prototype.isEqual = function(number, digits){digits = digits == undefined? 10: digits; // 默认精度为10return this.toFixed(digits) === number.toFixed(digits);}(1.0-0.7).isEqual(0.3); // return true
0 0
- Javascript 浮点运算问题
- JavaScript浮点运算的问题
- JavaScript浮点运算的问题
- Javascript浮点数运算问题
- javascript做浮点数运算精确问题
- JavaScript浮点数运算 -- 精度问题
- javascript 浮点运算问题分析与解决
- javascript浮点数运算精度问题
- Javascript 浮点运算问题分析与解决
- JavaScript浮点运算的精度问题
- Javascript 浮点运算问题分析与解决
- JavaScript 浮点数运算的精度问题
- JavaScript浮点数及运算精度问题
- javascript浮点精确运算
- JavaScript 浮点数运算
- JavaScript浮点运算公式
- JavaScript浮点数运算
- Javascript浮点数运算
- west laketour
- 使用java.util.zip包压缩和解压缩文件
- JS分栏
- c 选择排序
- 【无线互联】EGORefreshTableHeaderView下拉刷新 原理
- Javascript 浮点运算问题
- nyoj187快速查找素数
- 14.10.4输入无限组数据到数组的方法(数组无边界)
- POJ 3693 - Maximum repetition substring (后缀数组)
- 设计模式之命令模式
- 卡特兰数
- opencv2.4.5正确调用SurfFeatureDetector,SiftFeatureDetector
- Ubuntu14.04引导菜单修复
- Eclipse4.4安装旧版本插件报错 Failed to prepare partial IU