Javascript 浮点运算问题分析与解决
来源:互联网 发布:梦幻西游手游脚本源码 编辑:程序博客网 时间:2024/05/17 04:40
分析
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工具方法判断数值是否相等function isEqual(number1, number2, digits){digits = digits == undefined? 10: digits; // 默认精度为10return number1.toFixed(digits) === number2.toFixed(digits);}isEqual(1.0-0.7, 0.3); // return true// 原生扩展方式,更喜欢面向对象的风格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
转自:http://madscript.com/javascript/javscript-float-number-compute-problem/
0 0
- javascript 浮点运算问题分析与解决
- Javascript 浮点运算问题分析与解决
- Javascript 浮点运算问题分析与解决
- js浮点运算问题分析与解决
- js计算出现多位小数-Javascript 浮点运算问题分析与解决
- Javascript 浮点运算问题
- JavaScript浮点运算的问题
- JavaScript浮点运算的问题
- Javascript浮点数运算问题
- javascript做浮点数运算精确问题
- JavaScript浮点数运算 -- 精度问题
- javascript浮点数运算精度问题
- JavaScript浮点运算的精度问题
- JavaScript 浮点数运算的精度问题
- JavaScript浮点数及运算精度问题
- 解决浮点型运算精度丢失问题
- Python:浮点运算的问题与限制
- javascript浮点精确运算
- poj 1961 kmp算法之next数组的意义应用
- 《火鸡总动员》观后感
- MH370 的伤痛
- 背景建模SACON
- 链表相关的算法题大汇总 — 数据结构之链表奇思妙想
- Javascript 浮点运算问题分析与解决
- linux下安装protobuf及常见错误
- C++ iterator用法
- UPC:2536 Changlong(二进制技巧)
- 求一个32位数中1的个数
- iOS - Xcode升级到5.1& iOS升级到iOS7.1问题:Undefined symbols for architecture x86_64
- EBS OAF开发中的Java 实体对象(Entity Object)<三>
- cn_office_professional_plus_2010_with_sp1_x86_x64_732114安装密钥
- 《Go语言程序设计》第6章练习