JavaScript的BUG?浮点运算:0.1 + 0.2 != 0.3

浮点运算的问题

在JavaScript中进行纯小数运算偶尔会得到不正确的结果:

> 0.1 + 0.2 == 0.3
false

> 0.1 + 0.2
0.30000000000000004

很多人马上就开始认为JavaScript设计的不成熟,设计上有缺陷。

实际上这并不是JavaScript仅有的问题,C/C++/Java甚至Matlab都有这个问题。

?这只是JavaScript遵循IEEE 754标准所产生的必然结果。IEEE 754标准中的浮点数并不能精确地表达小数(比如说0.1),

  • 你需要足够的内存来保留5个数字
  • 你需要使用一个取值范围来确保精度。

在硬件层面,除法是转换成乖法来表示的,比如: Z = X/Y 会变成 Z = X * (1/Y);

JavaScript中的小数采用的是双精度(64位)表示的,由三部分组成: 符 + 阶码 + 尾数,在十进制中的 1/10,在十进制中可以简单写为 0.1 ,但在二进制中,他得写成:0.0001100110011001100110011001100110011001100110011001…..(后面全是 1001 循环)。因为浮点数只有52位有效数字,从第53位开始,就舍入了。这样就造成了“浮点数精度损失”问题。

所以你在处理小数运算时要非常小心。

怎么解决

就像标准中提到的,我们可以采用一个精确范围来比较是否相等

x = 0.2;
y = 0.3;
equal = (Math.abs(x - y) < 0.000001)

第二种方法是使用JavaScript内置的函数toPrecision或toFixed来保留一定的精度:

(0.1 + 0.2).toPrecision(10) == 0.3
> true

(0.1 + 0.2).toFixed(10) == 0.3
> true

如果你依然在编程的世界里迷茫,不知道自己的未来规划,可以加入web前端学习交流群:731771211 里面可以与大神一起交流并走出迷茫。新手可进群免费领取学习资料,看看前辈们是如何在编程的世界里傲然前行!群里不停更新最新的教程和学习方法(进群送web前端系统学习路线,详细的前端项目实战教学视频),有想学习web前端的,或是转行,或是大学生,还有工作中想提升自己能力的,正在学习的小伙伴欢迎加入

点击:加入

原文地址:http://blog.51cto.com/14197670/2352643

时间: 2024-11-06 09:34:26

JavaScript的BUG?浮点运算:0.1 + 0.2 != 0.3的相关文章

深入理解JavaScript系列:为什么03-0.2不等于0.1

五一宅家看书,所以接着更新一篇文章. 今天讲一下为什么03-0.2不等于0.1这个问题. 有点标题党的味道,在JavaScript中,当你试着对小数进行加减运算时,有时候会发现某个结果并非我们所想的那样,就比如标题中所说的为什么我用0.3去减0.2却得不到0.1? 当我碰到这个问题的时候我一下子也不知道问题到底出在哪,但他实实在在的就给出了一个0.09999999999999998的结论. 其实这个问题的本质原因就是在于计算机对浮点数的处理上,对于计算机的运算方法和数据的表示处理等内容是很大的一

如何解决JavaScript中0.1+0.2不等于0.3

console.log(0.1+0.2===0.3)// true or false?? 在正常的数学逻辑思维中,0.1+0.2=0.3这个逻辑是正确的,但是在JavaScript中0.1+0.2!==0.3,这是为什么呢?这个问题也会偶尔被用来当做面试题来考查面试者对 JavaScript的数值的理解程度. 在JavaScript中的二进制的浮点数0.1和0.2并不是十分精确,在他们相加的结果并非正好等于0.3,而是一个比较接近的数字 0.30000000000000004 ,所以条件判断结果

ASP.NET Core 共享第三方依赖库部署的Bug(*.deps.json on 2.2.0 or 4.6.0 版本)

背景: I try to put the Microsoft.*.dll and System.*.dll togather to a new folder.以便把(第三方或)系统的和应用的dll分开.之前花了很长的一段时间研究之后,最后:I find xxx.deps.json can make it work. 之后我还特意写了篇文章介绍它:https://www.cnblogs.com/cyq1162/p/10542832.html 今天遇Bug了: but today,when i up

为什么在JavaScript中0.1+0.2不等于0.3?

0.1+0.2不等于0.3?是不是有点颠覆你的认知,但是,在js中,是真实存在的! console.log(0.1+0.2); // 0.30000000000000004 其实这都是因为浮点数运算的精度问题. 简单来说,因为计算机只认识二进制,在进行运算时,需要将其他进制的数值转换成二进制,然后再进行计算. 由于浮点数用二进制表达时是无穷的: // 将0.1转换成二进制 console.log(0.1.toString(2)); // 0.000110011001100110011001100

React v15.5.0更新说明 &amp; v16.0.0更新预告

React今日发布了15.5.0版本,同时这也将是以15开头的最后一个版本,下一次发布,我们将迎来React 16.0.0 在15.5.0这一版本中,主要有以下两处改动: 独立React.PropTypes 在之前的版本之中,我们可以通过React.PropTypes这个API访问React内置的一些类型来检查props,在15.5.0版本中,这一API被独立成了一个新的包 prop-types // 15.4 以前 import React from 'react'; class Compon

百度地图 javascript相关Bug搜集

一 在手机里用百度地图js版做webapp   bug集合 1 之前用2.0版本的时候发现只要地图添加了覆盖物,无论数量多少,当地图放大到很小的范围时候,会卡死 1.1 当时处理办法:将版本降低至1.5版本再无此问题 2 今天测试自定义覆盖物的时添加点击事件,在andorid里面可以触发点击事件,但是换到ios里面打死都不触发 2.1 尝试解决:将版本换回2.0问题依旧 2.2 改用touchstart事件,问题得到解决,参考帖子:http://bbs.lbsyun.baidu.com/foru

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(二)

在上一篇文章中我详细的介绍了如何搭建maven环境以及生成一个maven骨架的web项目,那么这章中我将讲述Spring MVC的流程结构,Spring MVC与Struts2的区别,以及例子中的一些配置文件的分析. 一.Spring MVC 3.0介绍 Spring MVC是一个典型的MVC框架,是Spring内置的Web框架,可以作为应用项目的展示层,继Spring 2.0对Spring MVC进行重大升级后,Spring 2.5又为Spring MVC引入了注解驱动功能,再到3.0时代,全

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(四)

这一章大象将详细分析web层代码,以及使用Spring MVC的注解及其用法和其它相关知识来实现控制器功能.     之前在使用Struts2实现MVC的注解时,是借助struts2-convention这个插件,如今我们使用Spring自带的spring-webmvc组件来实现同样的功能,而且比之以前更简单.另外,还省掉了整合两个框架带来的不稳定因素.     对于Spring MVC框架,我主要讲一下它的常用注解,再结合一些示例进行说明,方便大家能够快速理解.     一.Spring MV

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五)

这是本系列的最后一篇,主要讲一下FreeMarker模板引擎的基本概念与常用指令的使用方式.     一.FreemMarker基本概念     FreemMarker是一个用Java语言编写的模板引擎,它是一个基于模板来生成文本输出的一个工具.是除了JSP之外被使用得最多的页面模板技术之一,另一个比较有名的模板则是Velocity.     用户可以使用FreeMarker来生成所需要的内容,通常由Java提供数据模型,FreeMarker通过模板引擎渲染数据模型,这样最终得到我们想要的内容.