双重划分失去准确性

时间:2013-07-23 17:21:14

标签: double

我遇到了两个整数的简单除法问题。我需要它尽可能准确,但由于某种原因,双重类型工作很奇怪。

例如,如果我执行以下代码:

double res = (29970.0/1000.0); 

结果是29.969999999999999,应该是29.970。

知道为什么会这样吗?

由于

4 个答案:

答案 0 :(得分:2)

  

我需要它尽可能准确

那么你不应该使用double。例如,在Java中,您将使用BigDecimal代替(大多数语言提供类似的功能)。 double操作在某种程度上本质上是不准确的。这是由于internal representationfloating point numbers

答案 1 :(得分:2)

  

知道为什么会这样吗?

因为双重表示是有限的。例如,IEEE754 double-precision标准对于分数有52位。因此,并非涵盖所有实数。因此,某些值不能在理想情况下精确。在你的情况下,结果距理想值10 ^ -15。

答案 2 :(得分:0)

float和double类型的浮点数以二进制格式存储。因此,数字不能具有精确的十进制值。相反,这些值是量化的。如果您假设只有2位分数类型,那么您将只能表示2 ^ -2个量子:0.00 0.25 0.50 0.75,之间没有任何内容。

答案 3 :(得分:0)

  

我需要它尽可能准确

没有银弹,但如果你只想要基本的算术运算(将map映射到ℚ),而你真的想要精确的结果,那么你最好的选择是由两个无限整数组成的理性类型(又名BigInteger,BigInt,等等 - 但即使这样,记忆也不是无限的,你必须考虑它。

关于问题的其余部分,请阅读固定大小的浮点数,有很多好的来源。