专栏首页机器之心为什么0.1+0.2不等于0.3?原来编程语言是这么算的……

为什么0.1+0.2不等于0.3?原来编程语言是这么算的……

打开你的 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

本文分享自微信公众号 - 机器之心(almosthuman2014)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 教程 | 如何使用贪婪搜索和束搜索解码算法进行自然语言处理

    机器之心
  • 入门 | 从PCC到MIC,一文教你如何计算变量之间的相关性

    选自FreeCoderCamp 作者:Peter Gleeson 机器之心编译 参与:陈韵竹、程耀彤、刘晓坤 本文介绍了几个重要的变量相关性的度量,包括皮尔逊相...

    机器之心
  • 深度学习开发环境调查结果公布,你的配置是这样吗?(附新环境配置)

    机器之心整理 参与:李泽南、李亚洲 本周一(6 月 19 日)机器之心发表文章《我的深度学习开发环境详解:TensorFlow + Docker + PyCha...

    机器之心
  • 你不会知道编程语言会把0.1+0.2算成多少

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

    小白学视觉
  • 为什么0.1+0.2不等于0.3?

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

    统计学家
  • 为什么 JavaScript 中 0.1+0.2 不等于 0.3 ?

    在 js 中进行数学的运算时,会出现0.1+0.2=0.300000000000000004的结果,一开始认为是浮点数的二进制存储导致的精度问题,但这似乎不能很...

    2020labs小助手
  • Latex设置

    Texpad live 编辑模式,即时编译 缺点:不支持高级packages,如cref 所以最后加

    列夫托尔斯昊
  • RHEL 7及CentOS 7 彻底禁用IPv6的方法

    版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

    耕耘实录
  • Django -- 视图是啥?模板是何物?

    在Django的官方文档中是这么定义视图的: "一类具有相同功能和模板的网页的集合",概念比较抽象,我们直接 拿比较简单常见论坛网站来举例,可能要求创建以下视图...

    cctester
  • 盘点互联网公司最常见的面试编程题

    互联网公司面试,笔试环节或第一面往往都是现场做编程题。很多面试的老铁反映说,败在了编程题上,去不了自己心仪的公司,拿不到想要的待遇。

    石晓文

扫码关注云+社区

领取腾讯云代金券