在java中我使用float来存储数字。我选择了浮点格式,因为我同时使用整数和双精度数,其中数字不同,可能有大整数或具有不同小数位数的大双精度数。但是当我将这些数字插入数据库时,存储了错误的数字。例如:
float value = 0f;
value = 67522665;
System.out.println(value);
打印:6.7522664E7,它在数据库中存储为 67522664 而不是 67522665
在java中我使用float来存储数字。我选择了浮点格式,因为我同时使用整数和双精度数,其中数字不同,可能有大整数或具有不同小数位数的大双精度数。但是当我将这些数字插入数据库时,存储了错误的数字。例如:
float value = 0f;
value = 67522665;
System.out.println(value);
打印:6.7522664E7,它在数据库中存储为 67522664 而不是 67522665
浮点数的分辨率有限——大约 7 个有效数字。您会看到舍入错误。您可以使用 adouble
以获得更高的分辨率,或者,对于精确的算术,使用BigDecimal
.
双打和花车有存储问题。 浮点数是如何存储的?
“float 和 double 类型主要是为科学和工程计算而设计的。它们执行二进制浮点算术,该算术经过精心设计,可以在很宽的量级范围内快速提供准确的近似值。但是,它们不能提供精确的结果,应该不能用于需要准确结果的地方。”
不要使用浮动。请改用BigDecimal。根据我对数据库的经验,他们将 NUMBER 类型的元素返回为 BigDecimal。当我使用 JDBC 获取它们时,它们是 BigDecimal 对象。
据我所知,这是关于二进制表示中的间隙大小(或ULP,最后一个位置的单位),即连续 f 点值之间的间距。
该值等于:
2^(e+1-p)
e是数字的实际指数,p是精度。
请注意,间距(或间隙)随着表示数字值的增加而增加:
在 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
参考:二进制浮点数的间距