在 Java 中,如果您执行 0.2 + 0.01
,您将得到 0.21000000000000002
这是由于IEEE 754。
但是,在 OCaml 中,如果您执行 0.2 +。 0.01
,那么你得到正确的结果 0.21
。
我认为 OCaml 也遵守 IEEE 754 的 float ,为什么 OCaml 可以给出正确的结果而 Java 不能?
最佳答案
在这种情况下,哪一个是“正确的”?从浮点运算的角度来看,Java在这里是正确的。无论如何,
OCaml toplevel 中的值由 genprintval.ml
打印,float
值由 print_float
打印,它使用 string_of_float
。它的定义在pervasives.ml
中:
let string_of_float f = valid_float_lexem (format_float "%.12g" f)
如您所见, float 是使用 printf 格式“%.12g”打印的。小于 10^{-12} 的东西会被简单地丢弃。这就是您看到“不正确”答案 0.21
的原因。如果提高精度,您将获得与 Java 相同的输出:
# Printf.sprintf "%.20g" (0.2 +. 0.01);;
- : string = "0.21000000000000002"
关于floating-point - OCaml 如何管理 float 加法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24488387/