2

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

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

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

4

3 回答 3

7

浮点数的分辨率有限——大约 7 个有效数字。您会看到舍入错误。您可以使用 adouble以获得更高的分辨率,或者,对于精确的算术,使用BigDecimal.

推荐阅读:每个计算机科学家都应该知道的关于浮点运算的知识

于 2013-05-03T04:41:13.763 回答
1

双打和花车有存储问题。 浮点数是如何存储的?

“float 和 double 类型主要是为科学和工程计算而设计的。它们执行二进制浮点算术,该算术经过精心设计,可以在很宽的量级范围内快速提供准确的近似值。但是,它们不能提供精确的结果,应该不能用于需要准确结果的地方。”

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

于 2013-05-03T04:51:08.250 回答
0

据我所知,这是关于二进制表示中的间隙大小(或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

参考:二进制浮点数的间距

于 2019-01-11T09:43:26.820 回答