0.1 + 0.2 不等于 0.3 ?这是为什么?

浮点数学

你的语言没有被破坏,它正在做浮点数学。计算机本身只能存储整数,因此它们需要某种表示十进制数的方法。这种表述并不完全准确。这就是为什么,通常情况下

 0.1 + 0.2 != 0.3

为什么会出现这种情况?

这实际上是相当有趣的。当你有一个以 10 为底的系统(像我们的系统)时,它只能表达使用底数素因数的分数。 10 的质因数是 2 和 5。因此 1/2、1/4、1/5、1/8 和 1/10 都可以清晰地表达,因为分母都使用 10 的质因数。相比之下,1 /3、1/6、1/7 和 1/9 都是循环小数,因为它们的分母使用质因数 3 或 7。

在二进制(或以 2 为底)中,唯一的质因数是 2,因此您只能清楚地表达分母只有 2 作为质因数的分数。在二进制中,1/2、1/4、1/8 都可以清晰地表示为小数,而 1/5 或 1/10 则为重复小数。因此,0.1 和 0.2(1/10 和 1/5)虽然在 10 基数系统中是干净的小数,但在计算机使用的 2 基数系统中却是重复小数。当您对这些重复的小数进行数学计算时,您最终会得到剩余的内容,当您将计算机的基数 2(二进制)数字转换为更易于人类阅读的基数 10 表示形式时,这些内容会保留下来。

以下是使用 0.1+0.2 多种语言发送到标准输出的一些示例。

//C语言
#include <stdio.h>

int main(int argc, char** argv) {
  printf("%.17f\n", .1 + .2);
  return 0;
}
0.30000000000000004
//C++

#include <iomanip>
#include <iostream>

int main() {
  std::cout << std::setprecision(17) << 0.1 + 0.2;
}
0.30000000000000004
//JAVA

System.out.println(.1 + .2);
and
System.out.println(.1F + .2F);

0.30000000000000004
and
0.3
# MySql

SELECT .1 + .2;

0.3
# Python 3

print(.1 + .2)
and
.1 + .2
and
float(decimal.Decimal('.1') + decimal.Decimal('.2'))
and
float(fractions.Fraction('0.1') + fractions.Fraction('0.2'))

0.30000000000000004
and
0.30000000000000004
and
0.3
and
0.3

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注