大浮点数很奇怪

时间:2013-05-03 04:39:45

标签: java floating-accuracy

在java中我使用float来存储数字。我选择浮点格式,因为我使用整数和双数,其中数字不同,可能有大整数或大的双数字,小数位数不同。但是当我将这些数字插入数据库时​​,会存储错误的数字。例如:

float value = 0f; value = 67522665; System.out.println(value);

印刷:6.7522664E7,它作为67522664存储在数据库中,而不是67522665

3 个答案:

答案 0 :(得分:7)

浮点数的分辨率有限 - 约为7位有效数字。你看到了圆整错误。您可以使用double获得更高分辨率,或者,对于精确算术,请使用BigDecimal

建议阅读:What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:1)

双打和花车有存储问题。 How is floating point stored?

“漂浮和双重类型主要是为科学和工程设计的 计算。它们执行二进制浮点运算,这是仔细的 旨在在很宽的范围内快速提供准确的近似值。 但是,它们不能提供准确的结果,不应在其中使用 确切的结果是必需的。“

不要使用浮动。请改用 BigDecimal 。根据我对数据库的经验,他们将NUMBER类型的元素作为BigDecimal返回。当我使用JDBC获取它们时,它们是BigDecimal对象。

答案 2 :(得分:0)

据我所知,这与二进制表示形式中的间隙大小(或ULP,最后一个单位)有关,是连续的f点值之间的间隔。

此值等于:

2^(e+1-p)

是数字的实际指数,而 p 精度

请注意,间距(或间隙)随着所表示数字的值的增加而增加:

enter image description here

在IEEE-754中,精度为 p 24,因此您可以看到,当 e> = 23 时,我们可以开始讨论浮点世界中的整数间距

2^23 = 8388608   --> 8388608 actually stored IEEE-754
       8388608.2 --> 8388608 actually stored IEEE-754

数字越大,情况越糟。例如:

164415560 --> 164415552 actually stored IEEE-754

参考:The Spacing of Binary Floating-Point Numbers