5

我对这种减法和求和如何以这种方式工作感到有些困惑:

A = 5
B = 0.1
C = A+B-A

我发现答案是 0.099999999999999645。为什么答案不是 0.1?

4

5 回答 5

4

这是一个浮点舍入误差。Python 网站上有一个关于浮点数的非常好的教程,解释了这是什么以及为什么会发生。

如果你想要一个准确的结果,你可以:

  • 尝试使用十进制模块
  • 格式化您的结果以显示一组小数位数(这不能解决舍入错误):

    print "%.2f"%C

我还建议阅读 Brian 的回答中的“What Every Computer Scientist Should Know About Floating-Point Arithmetic”。

于 2013-06-19T05:00:47.043 回答
2

您会看到浮点运算的人工制品,它没有无限精度。有关FP 数学如何工作以及为什么会出现舍入错误的完整描述,请参阅这篇文章。

于 2013-06-19T05:01:05.027 回答
2

这是因为所谓的 epsilon 值。这意味着从xx+E每个浮点数都被认为等于x你可以在 python 的这个问答中读到一些关于这个值的东西 这个 epsilon 值(E)取决于数字的大小,你总是可以从numpy.spacing(x)

于 2013-06-19T05:03:56.033 回答
2

计算机使用“二进制数”来存储信息。整数可以精确存储,但小数通常存储为“浮点数”。

有些数字很容易以 10 为基数编写,但无法以二进制浮点格式精确表示,而 0.1 就是其中之一。

可以准确地存储数字,并准确地使用这些数字。例如,数字 0.1 可以存储为1 / 10,换句话说,存储为分子 (1) 和分母 (10),要理解分子除以分母。然后一个正确编写的数学库可以处理这些分数并为你做数学。但它比仅仅使用浮点数要慢得多,所以它并不经常使用。(而且我认为在银行业务中,他们通常只使用整数而不是浮点来存储货币;1.23 美元可以存储为数字 123,隐含两位小数。在处理货币时,浮点数不够精确! )

于 2013-06-19T05:04:59.860 回答
2

为什么答案不是 0.1?

浮点数不够精确,无法得到答案。但圣牛是它曾经接近过!

我建议你阅读“每个计算机科学家应该知道的关于浮点运算的知识

于 2013-06-19T05:00:03.183 回答