为什么JavaScript中0.1 + 0.2 != 0.3

 更新时间:2020年12月03日 14:18:10   作者:LuckXinXin  
这篇文章主要给大家介绍了关于为什么JavaScript中0.1 + 0.2 != 0.3的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

涉及面试题:为什么 0.1 + 0.2 != 0.3?如何解决这个问题?

原因,因为 JS 采用 IEEE 754双精度版本(64位),并且只要采用 IEEE 754的语言都有该问题

我们都知道计算机是通过二进制来存储东西的,那么 0.1 在二进制中会表示为

// (0011) 表示循环
0.1 = 2^-4 * 1.10011(0011)

我们可以发现,0.1 在二进制中是无限循环的一些数字,其实不只是 0.1,其实很多十进制小数用二进制表示都是无限循环的。这样其实没什么问题,但是 JS采用的浮点数标准却会裁剪掉我们的数字。

IEEE 754 双精度版本(64位)将 64 位分为了三段

  • 第一位用来表示符号
  • 接下去的 11 位用来表示指数
  • 其他的位数用来表示有效位,也就是用二进制表示 0.1 中的 10011(0011)

那么这些循环的数字被裁剪了,就会出现精度丢失的问题,也就造成了 0.1 不再是 0.1 了,而是变成了 0.100000000000000002

0.100000000000000002 === 0.1 // true

那么同样的,0.2 在二进制也是无限循环的,被裁剪后也失去了精度变成了 0.200000000000000002

0.200000000000000002 === 0.2 // true

所以这两者相加不等于 0.3 而是 0.300000000000000004

0.1 + 0.2 === 0.30000000000000004 // true

那么可能你又会有一个疑问,既然 0.1 不是 0.1,那为什么 console.log(0.1) 却是正确的呢?

因为在输入内容的时候,二进制被转换为了十进制,十进制又被转换为了字符串,在这个转换的过程中发生了取近似值的过程,所以打印出来的其实是一个近似值,你也可以通过以下代码来验证

console.log(0.100000000000000002) // 0.1

解决

parseFloat((0.1 + 0.2).toFixed(10)) === 0.3 // true

到此这篇关于为什么JavaScript中0.1 + 0.2 != 0.3的文章就介绍到这了,更多相关JS中0.1 + 0.2 != 0.3内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何设置一定时间内只能发送一次请求

    如何设置一定时间内只能发送一次请求

    这篇文章主要介绍了如何设置一定时间内只能发送一次请求,需要的朋友可以参考下
    2014-02-02
  • 微信小程序国际化探索实现(附源码地址)

    微信小程序国际化探索实现(附源码地址)

    这篇文章主要介绍了微信小程序国际化探索实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 使用rollup打包JS的方法步骤

    使用rollup打包JS的方法步骤

    这篇文章主要介绍了使用rollup打包JS的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • JS面试题之如何判断两个数组的内容是否相等

    JS面试题之如何判断两个数组的内容是否相等

    这篇文章主要为大家详细介绍了JavaScript面试的常考题,即如何判断两个数组的内容是否相等,文中的示例方法讲解详细,需要的小伙伴可以参考一下
    2023-10-10
  • JavaScript如何监测数组的变化

    JavaScript如何监测数组的变化

    最近在造轮子的时候遇到了这么一个问题,那就是数组在调用内部方法的时候怎么才可以监听到数组发生了变化,这篇文章主要给大家介绍了关于JavaScript如何监测数组变化的相关资料,需要的朋友可以参考下
    2021-07-07
  • 仿Google和Windows Live的拖拽

    仿Google和Windows Live的拖拽

    仿Google和Windows Live的拖拽...
    2006-11-11
  • javascript实现3D变换的立体圆圈实例

    javascript实现3D变换的立体圆圈实例

    这篇文章主要介绍了javascript实现3D变换的立体圆圈效果,涉及javascript动态操作页面元素实现滚动与变色的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • JavaScript同步与异步任务问题详解

    JavaScript同步与异步任务问题详解

    这篇文章主要介绍了JavaScript事件循环同步任务与异步任务,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • TypeScript条件类型与内置条件类型超详细讲解

    TypeScript条件类型与内置条件类型超详细讲解

    我们可以使用TypeScript中的条件类型来根据逻辑定义某些类型,就像是在编写代码那样。它采用的语法和我们在JavaScript中熟悉的三元运算符很像:condition ? ifConditionTrue : ifConditionFalse。我们来看看他是怎么工作的
    2023-03-03
  • javascript 极速 隐藏/显示万行表格列只需 60毫秒

    javascript 极速 隐藏/显示万行表格列只需 60毫秒

    隐藏表格列 这种方式的效率极低。例如,隐藏一个千行表格的某列,在我的笔记本(P4 M 1.4G,768M内存)上执行需要约 4000毫秒的时间,令人无法忍受。
    2009-03-03

最新评论