Javascript 浮点计算问题分析与解决
分析
JavaScript 只有一种数字类型 Number
,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的。 浮点数的精度问题不是JavaScript特有的,因为有些小数以二进制表示位数是无穷的:
十进制 二进制
0.1 0.0001100110011001100110011001100110011001100110011001101
0.2 0.001100110011001100110011001100110011001100110011001101
0.3 0.010011001100110011001100110011001100110011001100110011
0.4 0.01100110011001100110011001100110011001100110011001101
0.5 0.1
0.6 0.10011001100110011001100110011001100110011001100110011
0.7 0.1011001100110011001100110011001100110011001100110011
0.8 0.1100110011001100110011001100110011001100110011001101
0.9 0.11100110011001100110011001100110011001100110011001101
所以比如 1.1
,其程序实际上无法真正的表示 ‘1.1’,而只能做到一定程度上的准确,这是无法避免的精度丢失:
1.09999999999999999
在JavaScript中问题还要复杂些,这里只给一些在Chrome中测试数据:
输入 输出
1.0-0.9 == 0.1 False
1.0-0.8 == 0.2 False
1.0-0.7 == 0.3 False
1.0-0.6 == 0.4 True
1.0-0.5 == 0.5 True
1.0-0.4 == 0.6 True
1.0-0.3 == 0.7 True
1.0-0.2 == 0.8 True
1.0-0.1 == 0.9 True
解决
那如何来避免这类 ` 1.0-0.9 != 0.1 ` 的非bug型问题发生呢?下面给出一种目前用的比较多的解决方案, 在判断浮点运算结果前对计算结果进行精度缩小,因为在精度缩小的过程总会自动四舍五入:
(1.0-0.9).toFixed(digits) // toFixed() 精度参数须在 0 与20 之间
(1.0-0.9).toFixed(10)== 0.1 // 结果为True
(1.0-0.8).toFixed(10)== 0.2 // 结果为True
(1.0-0.7).toFixed(10)== 0.3 // 结果为True
(11.0-11.8).toFixed(10) == -0.8 // 结果为True parseFloat((1.0-0.9).toFixed(10)) === 0.1 // 结果为True
parseFloat((1.0-0.8).toFixed(10)) === 0.2 // 结果为True
parseFloat((1.0-0.7).toFixed(10)) === 0.3 // 结果为True
parseFloat((11.0-11.8).toFixed(10)) === -0.8 // 结果为True
方法提炼
// 通过isEqual工具方法判断数值是否相等
function isEqual(number1, number2, digits){
digits = digits || 10; // 默认精度为10
return number1.toFixed(digits) === number2.toFixed(digits);
} isEqual(1.0-0.7, 0.3); // return true // 原生扩展方式,更喜欢面向对象的风格
Number.prototype.isEqual = function(number, digits){
digits = digits || 10; // 默认精度为10
return this.toFixed(digits) === number.toFixed(digits);
} (1.0-0.7).isEqual(0.3); // return true
Javascript 浮点计算问题分析与解决的更多相关文章
- Javascript 浮点运算问题分析与解决
分析 JavaScript 只有一种数字类型 Number ,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的. 浮点数的精度问题不是JavaScript特有的,因为有些小数 ...
- JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法
今天在程序中出现一个bugger ,调试了好久,最后才发现,原来是这个问题. 做了一个实验: alert(parseInt("01")),当这个里面的值为01====>07时 ...
- php中session_start()相关问题分析与解决办法
介绍下,在php中使用session时遇到的一些问题,与相关解决方法.1.错误提示Warning: Cannot send session cookie - headers already sentW ...
- firefox下对ajax的onreadystatechange的支持情况分析及解决
一.问题: var xmlHttp; function savecarttodata(){ createXMLHttpRequest(); var rndcode = new Date().getTi ...
- Mybatis关联查询和数据库不一致问题分析与解决
Mybatis关联查询和数据库不一致问题分析与解决 本文的前提是,确定sql语句没有问题,确定在数据库中使用sql和项目中结果不一致. 在使用SpringMVC+Mybatis做多表关联时候,发现也不 ...
- C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析与解决方法
对于C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析,目前本人分析两种情况,如下: 情况一: 借鉴麒麟.NET ...
- 启动Tomcat一闪而过——分析及解决过程
启动Tomcat一闪而过--分析及解决过程 嗯,昨天将有关JDK的知识稍微整理了一下,现在稍微整理一下有关Tomcat的! 1:Tomcat是什么? Tomcat是当今世界上使用最为广泛的.开源免费的 ...
- SQL Server2005索引碎片分析和解决方法
SQL Server2005索引碎片分析和解决方法 本文作者(郑贤娴),请您在阅读本文时尊重作者版权. 摘要: SQL Server,为了反应数据的更新,需要维护表上的索引,因而这些索引会形成碎片.根 ...
- mybatis异常:Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}问题分析及解决
转载自:http://blog.csdn.net/jackpk/article/details/44158701 mybatis异常:Improper inline parameter map for ...
随机推荐
- 实验三:敏捷开发与XP实践
Java实验三报告 一. 实验内容 (一)敏捷开发与XP 内容:1.敏捷开发(Agile Development)是一种以人为核心.迭代.循序渐进的开发方法. 2.极限编程(eXtreme Pro ...
- 课堂实践ASL博客
实践博客 二分法查找元素 1.首先定义三个位置min,mid,max 2.每次从所有元素所处位置的中间开始查找(所有元素必须以由小及大顺序排列完毕) 3.当中间元素大于所查找元素时,从中间元素(mid ...
- delphi 图像处理 图像放大缩小
procedure TDR_QM_ZP_Form.btn_FDClick(Sender: TObject); //图像放大 begin my_int1 := Trunc( my_int1 * 1.1) ...
- 第二阶段Sprint冲刺会议6
进展:将“录制”及“保存”整合到一起,修复出现的Bug,使之能够正常运行.
- scanf() scanf_s() 区别
写博原因:这几天由于小学期的缘故,接触到了好多C代码,在VS2013中编译的时候,遇到了如下问题: 错误 1 error C4996: 'scanf': This function or variab ...
- 灵悟礼品网上专卖店Sprint计划
一.现状 小组成员初步了解了所做项目的大致内容,需要时间一步一步分析和规划. 二.部分需求索引卡 第一个阶段没有具体功能的实现,只是先把所要做的项目思路理清,并把相应的数据库建立好. 三.任务认领 产 ...
- Spring 2.0
ProductBacklog:继续向下细化; 1.界面美化,统一界面风格,以简洁美观为主: 2.丰富版面的内容,吸引用户: 3.尝试增加新的版面: Sprint 计划会议:确定此次冲刺要完成的目标 1 ...
- 英文词频统计的java实现方法
需求概要 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 分析 1.读取文件可使用BufferedReader ...
- 通过分析java heap dump解决生产问题
最近在生产环境遇到一个问题,正常情况下,ECS CPU始终保持在10%以下,内存也只占用40%左右,但是连续2天出现了CPU占用100%的情况,然后系统卡住.看阿里云的ECS监控,能看到CPU飙到了1 ...
- Android 目录结构
Android目录结构中,values目录下对应的是应用程序所需要的数据,网上看到了一个包含values-v11等values-*的写法. 是为了进行分辨率的自适应????????? 因为还没有涉及到 ...