java 计算0.1 0.2,为什么0.1+0.2不等于0.3?原来编程语言是这么算的……
原标题:为什么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?原来编程语言是这么算的……相关推荐
- 求两个数字的乘积,如果大于0,说明两个数字同号,如果小于0,说明两个数字异号,如果等于0,说明其中一个是0
学了java基础东西,就写了这个编程,求两个数字的乘积,如果大于0,说明两个数字同号,如果小于0,说明两个数字异号,如果等于0,说明其中一个是0 首先程序要求我们输入两个数字,我就用了Scanner来 ...
- 特征值 是 系数行列式等于0时的 解
目录 特征值与特征向量 齐次线性方程组的解 参考 完 特征值与特征向量 对 n n n阶矩阵 A A A,如果数 λ \lambda λ和 n n n维非零列向量 x x x使关系式 A x = λ ...
- JAVA计算:用 100 元钱买 100 支笔,其中钢笔 3 元 / 支,圆珠笔 2 元 / 支,铅笔 0.5 元 / 支,问钢笔、圆珠笔和铅笔可以各买多少支 ?
Java 计算 用 100 元钱买 100 支笔,其中钢笔 3 元 / 支,圆珠笔 2 元 / 支,铅笔 0.5 元 / 支,问钢笔.圆珠笔和铅笔可以各买多少支 ? 穷举法,用JAVA写了一下,代码很 ...
- 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 ...
- 浮点数0.7在Java中是无法精确存储的,却为何能精确输出0.7
2019独角兽企业重金招聘Python工程师标准>>> 这是在其他地方看到的一个提问,提问原文链接:https://www.oschina.net/question/2346828_ ...
- /*编程实现邮局寄包裹的邮费计算:用户输入包裹的重量,按如下规定计算邮费。 * 邮局对包裹邮费规定如下:重量(千克)不超过10,收费标准为0.80元/千克; * 不超过20,收费标准为0.75元/
/*编程实现邮局寄包裹的邮费计算:用户输入包裹的重量,按如下规定计算邮费. * 邮局对包裹邮费规定如下:重量(千克)不超过10,收费标准为0.80元/千克: * 不超过20,收费标准为0.75元/ ...
- Java黑皮书课后题第2章:2.3(将英尺转化为米)编写程序,读入英尺数,将其转换为米数并显示结果。1英尺等于0.305米
2.3(将英尺转化为米)编写程序,读入英尺数,将其转换为米数并显示结果.1英尺等于0.305米 题目 题目描述 破题 代码块 方法评价 修改日志 题目 题目描述 2.3(将英尺转化为米)编写程序,读入 ...
- 用java实现生成12位的随机纯数字且首位不能为0
用java实现生成12位的随机纯数字且首位不能为0 1 逐个拼接法 1.1 核心思想 a.把得到的符合条件的每一位数字通过**+进行字符串的拼接** b.条件:为首位数字时,需要把范围去除0,其余位0 ...
- Java黑皮书课后题第2章:2.4(将磅转换为千克)编写程序,将磅数转换为千克数。程序提示用户输入磅数,然后转换为千克并显示结果。1磅等于0.454千克
2.4(将磅转换为千克)编写程序,将磅数转换为千克数.程序提示用户输入磅数,然后转换为千克并显示结果.1磅等于0.454千克 题目 题目概述 运行示例 破题 代码块 方法评价 修改日志 题目 题目概述 ...
- Sql 中两个数除法计算结果等于0原因是什么?
问题 今天执行一个存储过程的时候, 发现执行结果和预期的结果不一致, 但是存储过程并没有发生错误!于是就一句一句的去查找问题,最后发现是在对两个数字进行除法计算的时候产生的问题.我惊奇的发现 138 ...
最新文章
- 高效程序猿之(四)VS2010其他技巧
- 皮一皮:谁来解释下一无所有的字典含义?
- 《java编程思想》学习笔记——复用类
- Vagrant 手册之多个虚拟机 multi-machine
- 存在网路的情况下重命名SDE中数据图层错误(The orphan junction feature class cannot be renamed)...
- 专科 java转go 翱翔之路(二)基础语法:匿名组合,方法,接口,map,json,异常处理,channel管道,select用法
- tomcat 默认站点的配置
- HDU2546_用01背包做
- HDU 3068 最长回文
- 3m格式的文件怎么转换成mp3_一招就能让PDF与其他格式文件相互转换,这样的大招你值得拥有...
- 测试案例6种编写方法_一种编写测试的好方法
- glide加载gif图不显示动画_用Python绘制会动的柱形竞赛图
- NA-NP-IE系列实验44: 划分VLAN
- 小程序 onReachBottom 事件快速滑动时不触发的bug
- 数据结构与与算法之希尔排序
- RHCE盘点(5)—— 打印机
- Android仿QQ空间
- 内存颗粒位宽和容量_【存储器】浅谈SDRAM内存芯片位宽
- javascript系列-class6.String类型
- JavaScript点名器
热门文章
- 纯干货:Linux抓包命令集锦
- 计算机c盘中无法搜索文件格式,电脑C盘中programdata文件夹找不到该怎么办
- 计算机显示无法格式化,U盘无法格式化怎么办?Win7提示Windows 无法完成格式化的解决方法...
- UVA1449 Dominating Patterns
- 电容式计算机键盘的按键下,计算机键盘开关
- 关于H.264 profile-level-id
- 时间同步服务器,保障您的计算机系统时钟精准
- 游戏攻略 一 天堂W(韩)
- 总结:项管成本管理计算公式
- jena4.1.0安装及使用