在kmeans
中运行java
聚类时,数据点0.33和0.99之间的绝对差异显示为0.659999999而不是0.66。
为什么?
保存数据的变量都是double
类型,我正在使用Math.abs()
函数。
我只看到0.99这样的问题。当使用其他值减去时,结果很好。
感谢您的帮助
答案 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