快速注册 找回密码

QQ登录

只需一步,快速开始

查看: 1097|回复: 5

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

[复制链接]

该用户从未签到

升级  44.5%

送鲜花(0) 砸鸡蛋(0)
发表于 2021-2-23 23:17:42 | 显示全部楼层 |阅读模式
提示您:未得到智伍应用正式版的授权,部门功能受到影响!



尊重的用户,您好!!


非常感谢您能安装智伍应用旗下的产物,为了产物的可连续发展和升级,云收罗已经开始按天收费,发起购买200天,免费赠予400天,一共600天,均匀天天仅需1.67元。


向用户收费是为了给用户更可靠的保障和服务,所收取的费用重要用于产物的正常运作、不停研发和改进,盼望各位用户可以或许明白和支持。



购买正式版授权请打开下面的网址自助购买:
www.zhiwu55.com/authorization/buy_end_time.php?hzw_appid=B4592D53D254F99549C9FBF696104B22



购买之后,主动开通正式版授权,新收罗的内容不会再出现未购买授权的提示信息,同时智伍应用旗下全部含云收罗功能的产物,都无需再次购买云收罗的正式版授权,即云收罗的授权可以在智伍应用的各个产物那边通用!


假如您已经购买了正式版,照旧会出现未购买授权的提示,大概有别的题目,请接洽智伍应用官方在线客服QQ/微信:2085244671




选自Medium 作者:Parul Malhotra
呆板之心编译 到场:高璇、张倩
打开你的 Python,输入「0.1+0.2=」,效果是多少?0.30000000000000004 对不对?为什么效果不是 0.3?本文作者给出了具体的表明。
从小我们就知道 0.1 + 0.2=0.3。但是,在光怪陆离的盘算天下中,运算方式却大相径庭。
我近来开始用 JavaScript 举行编码,在阅读数据范例时,我留意到 0.1 + 0.2 不即是 0.3 的希奇举动。我向 Stack Overflow 寻求资助,在上面找到了一些有效的帖子。如下图所示:
G55060FM56nmOM9m.jpg Stack Overflow 界面图像。
颠末大量的研究和数学运算后,我得出结论,这不是错误。这是数学运算中的浮点运算。让我们进一步相识内涵机制。
题目形貌:为什么 0.1 + 0.2 = 0.30000000000000004?
假如你用 Java 或 C 语言编过程,那你肯定知道用于存储值的差别数据范例。我们在前面的讨论中将思量两种数据范例:整数型和浮点型。
整数型存储整数,而浮点型存储小数。
在这之前,我们先来相识一个小概念:为了实现盘算,数字是怎样表现的?极小数和极大数通常用科学计数法表现,即:
同样,假如一个用科学计数【*****智伍应用提示您:未购买正式版授权,功能受到影响!!请根据最上面的引导提示,自助购买正式版授权,主动开通!!在线客服微信:ccccyyyy4444,官方网站:zhiwu55.com*****】,则该数字是尺度化写法。比方,0.0005606 用科学计数法的尺度化写法为:
Significant 是指不包罗零的有用数字,base 表现所利用的进制——此处为十进制(10)。Exponent(指数)表现小数点必要向左或向右移动的步数。
如今,有两种表现浮点数的方法:单精度和双精度。在举行浮点运算时,单精度利用 32 位,而双精度利用 64 位。
与很多其他编程语言差别,JavaScript 并未界说差别范例的数字数据范例,而是始终遵照国际 IEEE 754 尺度,将数字存储为双精度浮点数。
这种格式以 64 位存储数字,此中数字(分数)存储在位 0 到 51 中,指数存储在位 52 到 62 中,符号存储在位 63 中。
uYAScCtq04tBs1sk.jpg IEEE754 双精度尺度。
我们按 IEEE754 尺度用 64 位表现 0.1。第一步是将十进制的 0.1 转换为二进制的 0.1。起首将 0.1 乘以 2,然后将小数点前的数字分离出来,得到其相应的二进制数。
nPrJo5JcjmR6zMO5.jpg 重复此操纵至 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
声明:转载此文是出于通报更多信息之目标。如有泉源标注错误或侵占了您的正当权益,请作者持权属证实与本网接洽,我们将实时更正、删除,谢谢。

该用户从未签到

升级  44.5%

送鲜花(0) 砸鸡蛋(0)
 楼主| 发表于 2021-2-23 23:19:52 | 显示全部楼层
关键部门没有,看得我一脸懵逼

该用户从未签到

送鲜花(0) 砸鸡蛋(0)
发表于 2021-2-23 23:22:00 | 显示全部楼层
用手机盘算器运算0.1+0.1,你就会很忧郁!

该用户从未签到

升级  51%

送鲜花(0) 砸鸡蛋(0)
发表于 2021-2-23 23:24:11 | 显示全部楼层
十进制里的有限位数小数转换为二进制后,绝大部门会成为无穷循环的小数,盘算机是用有限的位数存储,一定产生数据截断,以是效果是禁绝确的。

该用户从未签到

送鲜花(0) 砸鸡蛋(0)
发表于 2021-2-23 23:27:09 | 显示全部楼层
3/10 是无穷循环小数,只能近似表现

该用户从未签到

升级  48.5%

送鲜花(0) 砸鸡蛋(0)
发表于 2021-2-23 23:29:04 | 显示全部楼层
不是0.3么,那里循环了//@bigbangdjl: 3/10 是无穷循环小数,只能近似表现
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

社区精彩导读

Powered by Discuz! X3.4 © 2006-2021 Comsenz Inc

本站信息来自网络,版权争议与本站无关。一切关于该资源商业行为与[小城社区]无关。 如有侵犯您版权的,请邮件与我们联系处理(邮箱:10000@546800.com),本站将立即改正。
快速回复 返回顶部 返回列表