Abs(0.33-0.99)= 0.6599999999为什么?

时间:2014-03-28 08:46:44

标签: java floating-point absolute

kmeans中运行java聚类时,数据点0.33和0.99之间的绝对差异显示为0.659999999而不是0.66。

为什么?

保存数据的变量都是double类型,我正在使用Math.abs()函数。

我只看到0.99这样的问题。当使用其他值减去时,结果很好。

感谢您的帮助

3 个答案:

答案 0 :(得分:3)

浮点数据类型(float和double)无法在内存位中准确表示。它们大致代表在记忆中。

  

将无数多个实数压缩成有限数量的位   需要近似的表示。虽然有无限的   许多整数,在大多数程序中,整数计算的结果都可以   以32位存储。相反,给定任意数量的位,   大多数带有实数的计算都会产生数量   不能使用那么多位来精确表示。因此   浮点计算的结果通常必须按顺序舍入   以适应其有限的表示。这个舍入误差是   浮点计算的特征

What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:2)

这是浮点数的行为方式。它们不准确。

选中此项: - What Every Computer Scientist Should Know About Floating-Point Arithmetic

另外,要添加浮点数,请使用二进制分数而不是小数分数。如果您需要精确的十进制值,则应使用java.math.BigDecimal

您可以查看此answer以获取更多推理和详细信息:

  

浮点舍入错误。 0.1不能表示为   准确地在基数2中,如在基数10中,由于缺少素数因子   5。

答案 2 :(得分:1)

双打不准确,因为它们存储在内存中。更多信息: https://en.wikipedia.org/wiki/Double-precision_floating-point_format

如果您需要确切的结果,请查看BigDecimal