在这里避免浮点计算错误的最佳方法是什么?

What is the best way to avoid floating point calculation error here?

我有两个变量a和b。第一个变量包含一个字符串格式的简单浮点数。第二个变量包含另一个简单的浮点数。我需要将它们相除并乘以一个常数。由于数字很简单,而且我需要比较操作的结果,因此我需要计算无误。实现此目标的最佳方法是什么?

public class FloatTest {
    public static void main(String[] args) {
        String a ="5";
        float b =(float) 4.8;
        float r = Float.valueOf(a)*24/b;
        System.out.println(r);
    }
}
result: 24.999998

结果似乎是二进制的 error-free。您假设 48/10 可以准确表达(“简单数字”)。这在十进制数字中是正确的,但在位中则不然。毫不奇怪,真的:10 不是 2 的幂,所以除以 10 并不是简单的移动 floating-point 数中的点的问题。

如果您需要确切的数字,请不要使用 finite-precision 格式,例如 FloatDecimal 类型会更合适。

您可以使用 John L. Gustafson“unums”,这是浮点数的替代方法。例如,参见 https://posithub.org/about, for example. Also, per IEEE, you should (many implementations have bugs or lack of support) be able to use the exceptions--see https://www.ibm.com/docs/en/aix/7.2?topic=concepts-floating-point-exceptions