Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为什么0.1+0.2不等于0.3?

为什么0.1+0.2不等于0.3?

作者头像
Ai学习的老章
发布于 2019-10-22 08:42:19
发布于 2019-10-22 08:42:19
1.8K0
举报

打开你的 Python,输入「0.1+0.2=」,结果是多少?0.30000000000000004 对不对?为什么结果不是 0.3?本文作者给出了详细的解释。

从小我们就知道 0.1 + 0.2=0.3。但是,在光怪陆离的计算世界中,运算方式却大相径庭。

我最近开始用 JavaScript 进行编码,在阅读数据类型时,我注意到 0.1 + 0.2 不等于 0.3 的奇怪行为。我向 Stack Overflow 寻求帮助,在上面找到了一些有用的帖子。如下图所示:

Stack Overflow 界面图像。

经过大量的研究和数学运算后,我得出结论,这不是错误。这是数学运算中的浮点运算。让我们进一步了解内在机制。

问题描述: 为什么 0.1 + 0.2 = 0.30000000000000004?

如果你用 Java 或 C 语言编过程,那你一定知道用于存储值的不同数据类型。我们在前面的讨论中将考虑两种数据类型:整数型和浮点型。

整数型存储整数,而浮点型存储小数。

在这之前,我们先来了解一个小概念:为了实现计算,数字是如何表示的?极小数和极大数通常用科学计数法表示,即:

同样,如果一个用科学计数法书写的数字小数点前有一个非零的十进制数,则该数字是标准化写法。例如,0.0005606 用科学计数法的标准化写法为:

Significant 是指不包含零的有效数字,base 表示所使用的进制——此处为十进制(10)。Exponent(指数)表示小数点需要向左或向右移动的步数。

现在,有两种显示浮点数的方法:单精度和双精度。在进行浮点运算时,单精度使用 32 位,而双精度使用 64 位。

与许多其他编程语言不同,JavaScript 并未定义不同类型的数字数据类型,而是始终遵循国际 IEEE 754 标准,将数字存储为双精度浮点数。

这种格式以 64 位存储数字,其中数字(分数)存储在位 0 到 51 中,指数存储在位 52 到 62 中,符号存储在位 63 中。

IEEE754 双精度标准。

我们按 IEEE754 标准用 64 位表示 0.1。第一步是将十进制的 0.1 转换为二进制的 0.1。首先将 0.1 乘以 2,然后将小数点前的数字分离出来,得到其相应的二进制数。

重复此操作至 64 位。然后把它们按升序排列,获取尾数,再根据双精度标准,我们将把其四舍五入到 52 位。

尾数

用科学计数法表示二进制 0.1 并只保留前 52 位:

尾数部分处理好后。现在我们用下面的方式处理指数:

这里,11 代表我们要使用的 64 位表示的指数位数,-4 代表科学计数中的指数。

所以最终数字 0.1 的表示形式是:

同理,0.2 表示为:

将两个数相加,得到:

转换为浮点数,它变成:

这就是 0.1 + 0.2 = 0.30000000000000004 的原因。

原文链接:https://medium.com/better-programming/why-is-0-1-0-2-not-equal-to-0-3-in-most-programming-languages-99432310d476

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与统计学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
多数编程语言里的0.1+0.2≠0.3?
我们从小就被教导说0.1+0.2=0.3,但是在奇妙的计算机编程世界里面,事情变得不一样了。
AI科技大本营
2019/10/14
8900
多数编程语言里的0.1+0.2≠0.3?
JavaScript 浮点数之迷:0.1 + 0.2 为什么不等于 0.3?
“0.1 + 0.2 = ?” 这个问题,你要是问小学生,他也许会立马告诉你 0.3。但是在计算机的世界里就没有这么简单了,做为一名程序开发者在你面试时如果有人这样问你,小心陷阱喽! 你可能在哪里见过
五月君
2020/02/19
4.3K0
0.1 + 0.2 不等于 0.3?原来是因为这个
浮点数精度丢失,一直是前端面试八股文里很常见的一个问题,今天我们就来深入的了解一下问题背后的原理,以及给一些日常处理的小技巧。
沐洒
2023/07/05
6820
0.1 + 0.2 不等于 0.3?原来是因为这个
为什么 JavaScript 中 0.1+0.2 不等于 0.3 ?
在 js 中进行数学的运算时,会出现0.1+0.2=0.300000000000000004的结果,一开始认为是浮点数的二进制存储导致的精度问题,但这似乎不能很好的解释为什么在同样的存储方式下0.3+0.4=0.7可以得到正确的结果。本文主要通过浮点数的二进制存储及运算,和IEEE754下的舍入规则,解释为何会出现这种情况。
2020labs小助手
2019/10/28
2K0
一个函数让你看懂 'Why 0.1+0.2!=0.3'
由于 JavaScript中没有将小数的 二进制转换成 十进制的方法,于是手动实现了一个。
ConardLi
2019/05/23
6780
原理解析 | JavaScript 计算0.1 + 0.2真的很难,看完才知道!
已经很久没有写技术文章了,脑袋瓜有点生锈,写的不好别见怪,今天就是想带点干货给大家分享一下。文章的内容有一点点难度,不过基本都是计算机组成原理的知识,算是温故而知新吧!
HTML5学堂
2020/07/14
8310
原理解析 | JavaScript 计算0.1 + 0.2真的很难,看完才知道!
0.1+0.2=0.30000000000000004问题的探究
首先声明这不是bug,原因在与十进制到二进制的转换导致的精度问题!其次这几乎出现在很多的编程语言中:C/C++,Java,Javascript中,准确的说:“使用了IEEE 754浮点数格式”来存储浮点类型(float 32,double 64)的任何编程语言都有这个问题!
mmzhou
2018/08/01
7400
JavaScript 中 0.1 + 0.2 的精度以及数字类型的整理
JavaScript 中的所有数字都是浮点数,使用 64 位二进制来表示,也叫做双精度浮点型,这种方式出自于 IEEE-754 标准。
上山打老虎了
2022/06/15
8100
JavaScript 中 0.1 + 0.2 的精度以及数字类型的整理
0.1+0.2 ≠ 0.3
JS中整数和浮点数统属于数字类型,在计算机中,所有的数字都是采用IEEE754标准的64位双精度浮点数形式存储,进而导致了无论是储存、计算中都会存在精度问题。其存储形式为: 1. 第一位是正负符号位,0: 正数 1: 负数
剁椒鱼鳞
2023/05/24
3390
0.1+0.2 ≠ 0.3
探秘 JavaScript 世界的神秘数字 1.7976931348623157e+308
JavaScript 的 Number 对象中存储了很多常量,神秘数字 1.7976931348623157e+308 就在其中,打开浏览器 Console,输入 Number.MAX_VALUE,就会得到这个数字:
清秋
2022/09/20
1.9K0
探秘 JavaScript 世界的神秘数字 1.7976931348623157e+308
0.1+0.2-0.3 等于0? 可以先用PLC试试
尾数为1.1001100010011001100..1100(共52位,除了小数京左边的1),指数为4(进制移码为0000000符号位为0
科控物联
2022/03/29
5200
0.1+0.2-0.3 等于0?  可以先用PLC试试
0.57 * 100 === 56.99999999999999 之谜
在最近业务开发中, 作者偶遇到了一个与 JavaScript 浮点数相关的 Bug。
腾讯IVWEB团队
2020/06/24
1.4K0
热点面试题:为什么 0.1+ 0.2 != 0.3,如何让其相等?
沉浸式趣谈
2024/03/13
1860
热点面试题:为什么 0.1+ 0.2 != 0.3,如何让其相等?
15 张图带你深入理解浮点数
团队一直保持着分享的习惯,而我却分享的较少。忘了当时同事分享什么主题,涉及到浮点数相关知识。于是我决定分享一期关于浮点数的,而且 Go 之父 Rob Pike 说不懂浮点数不配当码农。。。So?!
lucifer210
2020/10/26
3.8K0
15 张图带你深入理解浮点数
为什么0.1 + 0.2 不等于 0.3 ?
在很多编程语言中,我们都会发现一个奇怪的现象,就是计算 0.1 + 0.2,它得到的结果并不是 0.3,比如 C、C++、JavaScript 、Python、Java、Ruby 等,都会有这个问题。
奥耶可乐冰
2024/05/30
2890
为什么0.1 + 0.2 不等于 0.3 ?
0.1+0.2为什么不等于0.3
在于在JS中采用的IEEE 754的双精度标准,计算机内部存储数据的编码的时候,0.1在计算机内部根本就不是精确的0.1,而是一个有舍入误差的0.1。
用户9914333
2022/07/22
9240
0.1+0.2为什么不等于0.3
一道送命题:0.1+0.2 等于 0.3 吗?
去互联网金融或电商行业的公司面试时,一般都会遇类似“ 0.1+0.2 等于 0.3吗?”这道题,对于非科班出身的前端人是一道送命题,有些知道 0.1+0.2 不等于 0.3,但是继续深问为什么,就无法很清晰地回答。
Power7089
2021/03/25
1.8K0
一道送命题:0.1+0.2 等于 0.3 吗?
[第34期] 彻底搞懂Javascript 浮点数
前言 前段时间, 在群里跟 Peter 说到JS的浮点数问题。 他问我, 为什么 0.1 + 0.2 !== 0.3, 而 0.05 + 0.25 === 0.3 ? 当时也大概解释了下是精度丢失,
皮小蛋
2020/03/02
1.7K0
【优雅的避坑】你的钱算错了!为什么0.1+0.2不等于0.3了!?
我碰到过这样一个问题,对项目上用车记录中的用车里程、油耗、计价等数据进行计算,有一辆车花费了108.1元,还有一辆车的花费是29.2元,当计算这两个价格的和时出问题了,结果竟然不是137.3,而是137.29999999999998!
行百里er
2020/12/02
5420
【优雅的避坑】你的钱算错了!为什么0.1+0.2不等于0.3了!?
计算误差的真相:为什么 float 加法会出现精度损失?
float(浮点数)是一种在计算机编程中常用的数据类型,它用于表示带小数点的数字。在大多数编程语言中,float类型通常使用32位来表示,也被称为“单精度浮点数”或“单精度实数”。它可以表示的数值范围比整数类型要大得多,并且可以存储小数位数较多的数值。在C++、Java等语言中,float类型的定义通常如下:
Lion 莱恩呀
2024/07/31
1.2K0
计算误差的真相:为什么 float 加法会出现精度损失?
推荐阅读
相关推荐
多数编程语言里的0.1+0.2≠0.3?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档