我遇到了两个整数的简单除法问题。我需要它尽可能准确,但由于某种原因,双重类型工作很奇怪。
例如,如果我执行以下代码:
double res = (29970.0/1000.0);
结果是29.969999999999999,应该是29.970。
知道为什么会这样吗?
由于
答案 0 :(得分:2)
我需要它尽可能准确
那么你不应该使用double
。例如,在Java中,您将使用BigDecimal
代替(大多数语言提供类似的功能)。 double
操作在某种程度上本质上是不准确的。这是由于internal representation的floating 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,等等 - 但即使这样,记忆也不是无限的,你必须考虑它。
关于问题的其余部分,请阅读固定大小的浮点数,有很多好的来源。