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

选自Medium作者:Parul Malhotra

机器之心编译 参与:高璇、张倩

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

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

我最近开始用 Java 进行编码,在阅读数据类型时,我注意到 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 位。

与许多其他编程语言不同,Java 并未定义不同类型的数字数据类型,而是始终遵循国际 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返回搜狐,查看更多

责任编辑:

java 计算0.1 0.2,为什么0.1+0.2不等于0.3?原来编程语言是这么算的……相关推荐

  1. 求两个数字的乘积,如果大于0,说明两个数字同号,如果小于0,说明两个数字异号,如果等于0,说明其中一个是0

    学了java基础东西,就写了这个编程,求两个数字的乘积,如果大于0,说明两个数字同号,如果小于0,说明两个数字异号,如果等于0,说明其中一个是0 首先程序要求我们输入两个数字,我就用了Scanner来 ...

  2. 特征值 是 系数行列式等于0时的 解

    目录 特征值与特征向量 齐次线性方程组的解 参考 完 特征值与特征向量 对 n n n阶矩阵 A A A,如果数 λ \lambda λ和 n n n维非零列向量 x x x使关系式 A x = λ ...

  3. JAVA计算:用 100 元钱买 100 支笔,其中钢笔 3 元 / 支,圆珠笔 2 元 / 支,铅笔 0.5 元 / 支,问钢笔、圆珠笔和铅笔可以各买多少支 ?

    Java 计算 用 100 元钱买 100 支笔,其中钢笔 3 元 / 支,圆珠笔 2 元 / 支,铅笔 0.5 元 / 支,问钢笔.圆珠笔和铅笔可以各买多少支 ? 穷举法,用JAVA写了一下,代码很 ...

  4. Java计算1除以3结果为0_关于java:Int division:为什么1/3 == 0的结果?

    我写的是这段代码: public static void main(String[] args) { double g = 1 / 3; System.out.printf("%.2f&qu ...

  5. 浮点数0.7在Java中是无法精确存储的,却为何能精确输出0.7

    2019独角兽企业重金招聘Python工程师标准>>> 这是在其他地方看到的一个提问,提问原文链接:https://www.oschina.net/question/2346828_ ...

  6. /*编程实现邮局寄包裹的邮费计算:用户输入包裹的重量,按如下规定计算邮费。 * 邮局对包裹邮费规定如下:重量(千克)不超过10,收费标准为0.80元/千克; * 不超过20,收费标准为0.75元/

    /*编程实现邮局寄包裹的邮费计算:用户输入包裹的重量,按如下规定计算邮费.  * 邮局对包裹邮费规定如下:重量(千克)不超过10,收费标准为0.80元/千克:  * 不超过20,收费标准为0.75元/ ...

  7. Java黑皮书课后题第2章:2.3(将英尺转化为米)编写程序,读入英尺数,将其转换为米数并显示结果。1英尺等于0.305米

    2.3(将英尺转化为米)编写程序,读入英尺数,将其转换为米数并显示结果.1英尺等于0.305米 题目 题目描述 破题 代码块 方法评价 修改日志 题目 题目描述 2.3(将英尺转化为米)编写程序,读入 ...

  8. 用java实现生成12位的随机纯数字且首位不能为0

    用java实现生成12位的随机纯数字且首位不能为0 1 逐个拼接法 1.1 核心思想 a.把得到的符合条件的每一位数字通过**+进行字符串的拼接** b.条件:为首位数字时,需要把范围去除0,其余位0 ...

  9. Java黑皮书课后题第2章:2.4(将磅转换为千克)编写程序,将磅数转换为千克数。程序提示用户输入磅数,然后转换为千克并显示结果。1磅等于0.454千克

    2.4(将磅转换为千克)编写程序,将磅数转换为千克数.程序提示用户输入磅数,然后转换为千克并显示结果.1磅等于0.454千克 题目 题目概述 运行示例 破题 代码块 方法评价 修改日志 题目 题目概述 ...

  10. Sql 中两个数除法计算结果等于0原因是什么?

    问题 今天执行一个存储过程的时候, 发现执行结果和预期的结果不一致, 但是存储过程并没有发生错误!于是就一句一句的去查找问题,最后发现是在对两个数字进行除法计算的时候产生的问题.我惊奇的发现 138 ...

最新文章

  1. 高效程序猿之(四)VS2010其他技巧
  2. 皮一皮:谁来解释下一无所有的字典含义?
  3. 《java编程思想》学习笔记——复用类
  4. Vagrant 手册之多个虚拟机 multi-machine
  5. 存在网路的情况下重命名SDE中数据图层错误(The orphan junction feature class cannot be renamed)...
  6. 专科 java转go 翱翔之路(二)基础语法:匿名组合,方法,接口,map,json,异常处理,channel管道,select用法
  7. tomcat 默认站点的配置
  8. HDU2546_用01背包做
  9. HDU 3068 最长回文
  10. 3m格式的文件怎么转换成mp3_一招就能让PDF与其他格式文件相互转换,这样的大招你值得拥有...
  11. 测试案例6种编写方法_一种编写测试的好方法
  12. glide加载gif图不显示动画_用Python绘制会动的柱形竞赛图
  13. NA-NP-IE系列实验44: 划分VLAN
  14. 小程序 onReachBottom 事件快速滑动时不触发的bug
  15. 数据结构与与算法之希尔排序
  16. RHCE盘点(5)—— 打印机
  17. Android仿QQ空间
  18. 内存颗粒位宽和容量_【存储器】浅谈SDRAM内存芯片位宽
  19. javascript系列-class6.String类型
  20. JavaScript点名器

热门文章

  1. 纯干货:Linux抓包命令集锦
  2. 计算机c盘中无法搜索文件格式,电脑C盘中programdata文件夹找不到该怎么办
  3. 计算机显示无法格式化,U盘无法格式化怎么办?Win7提示Windows 无法完成格式化的解决方法...
  4. UVA1449 Dominating Patterns
  5. 电容式计算机键盘的按键下,计算机键盘开关
  6. 关于H.264 profile-level-id
  7. 时间同步服务器,保障您的计算机系统时钟精准
  8. 游戏攻略 一 天堂W(韩)
  9. 总结:项管成本管理计算公式
  10. jena4.1.0安装及使用