小言_互联网的博客

如何理解 0.1+0.2

296人阅读  评论(0)

0.1 + 0.2 = 0.3

这是很多人都知道的事,但是,你的程序往往告诉你:

0.1 + 0.2 = 0.30000000000000004

不信你试试

那么,为什么?


你应该知道,十进制的 2,用二进制表示就是 10
这也是计算机存储 2 的方式
也就是我们需要两个“位”:一个位存 1,另一个存 0

用两个“位”,可以存四个数字,他们是:

  • 00(十进制的 0)
  • 01(十进制的 1)
  • 10(十进制的 2)
  • 11(十进制的 3)

我们买的 u 盘,经常说,是“2G 的”、“8G的”、“128G的”
而且我们都知道,“8G”的,比“2G”的存得多
但再多,也有个“限度”,总有装满的时候

所谓 8 G,就是说,这个 u 盘有 8000 M,或者 8 * 1024 M
也就是 8,000,000 K,或者 8 * 1024 * 1024 K
而 1 K,有八个“位”,就是上面说的那个“位”,
所以,8 G,就有 8,000,000 * 8 个“位”,或者 8 * 1024 * 1024 * 8 个“位”

两个位,可以存四个数字,那 8 G 呢?
很多,但不是无限多
也就是说,再大的存储器(不论是 u 盘、硬盘、内存条……)也只能表示“有限个”数字

但,有多少个数字?
无限个,这个无限,不仅仅是十、百、千、万、十万……这样向上增长
也有 0.1, 0.11, 0.111, 0.1111, 0.11111 ……这种小数
你会发现,-10之间,就有无数个“数”

那计算机怎么用有限的存储器,表示无限的数呢?

整数还好,常用的整数的范围不大
我们只需要 64 个位,就可以表示 2 的 64 次方个数字
即 18,446,744,073,709,552,000 个数字
你能想象什么场景下,能用到这么大的数吗
而几十块钱一个的 u 盘,竟然有 64,000,000 个位

但,-10之间有无数个“小数”
无奈,计算机只能
用近似值来存小数

所以,你会发现,计算机认为:
0.111111111111111111111111111111

0.1111111111111111111111111111111111111111111
是“相等的”!
因为,对这俩数,计算机都会“偷工减料”
只存前面的 n 位
因为:

  • 后面的位太小了,不重要(借口)
  • 没有能力存全部(真正原因)

虽然是借口,但我们人类还是接受了
毕竟我们人类在大部分情况下,允许极小的误差

回到最初的问题,0.1 + 0.2 = ?

当我们说 0.1 的时候,我们一般说的是十进制的 0.1,即十分之一,即 1/10
那么二进制的 0.1,是多少?当然是“二分之一”,即 1/2

可能你觉得有些别扭,你可以这么想一下(十进制中):

  • 十个 10 加起来,等于 100
  • 十个 1 加起来,等于 10
  • 十个 0.1 加起来,等于 1

那么在二进制中:

  • 10 + 10 = 100
  • 1 + 1 = 10
  • 0.1 + 0.1 = ?

我想,你应该知道了,十进制中的 0.1 和 二进制中的 0.1 不相等
我们的问题0.1 + 0.2 = ?中的 0.1 显然是十进制中的 0.1
那么转化为二进制,是……?
不管是多少,我们先给它起个名字:“奤”

先考虑一个问题,3/10 是多少?
0.333333333333333333333333333333……
二进制中,也有这样的数,奤就是其中一员

上面说了,计算机只认识“有限”个数
奤这种,小数点后面有无穷无尽个 0、1,电脑肯定不认识
电脑只认识奤的近似值
也就是,当你写下 0.1 时,电脑只存了个 0.1 的近似值
不幸的是,0.2 也是个奤
所以,当你让电脑算 0.1 + 0.2 = ?
它只是把“0.1 的近似值”加上“0.2 的近似值”
这怎么可能得到准确的结果?

那……

  • 为什么 0.1 + 0.1 就能得到准确的结果?
  • 0.1 为什么是个奤?

如果你对这俩问题感兴趣,可以留个言
因为我不确定写这么多字,是不是真有人感兴趣,如果真有的话,会继续写的


转载:https://blog.csdn.net/csdn372301467/article/details/114834724
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场