-5

我有一个类似于 80.14666666666668 的双变量,然后我使用 floor 函数将其截断为 8 位数字,例如 80.14666666。现在我想增加这个值并得到答案 80.14666667

4

4 回答 4

2

您可能不知道doubles 的真实性质。他们没有“数字”;它们是有理数的紧凑二进制编码。因此,您会发现很难以编程方式确定 a 的“最后一位”是什么double

如果您的特定需求只是四舍五入,请使用该round函数而不是truncate; 否则考虑使用 a BigDecimal,它真正代表一个带有十进制数字的数字。

于 2013-06-03T13:09:59.127 回答
0

只需在数字上加上 0.00000001。

但是,浮点值不太适合这样的计数。每次增加它时,都会增加一个差异,因为像这样的数字仅在浮点数中近似表示。

如果要增加数字,请改用整数。将该数字乘以 100000000 并将其转换为整数,从而得到 8014666666。现在您可以将整数加一而不会引入任何错误。保持整数递增,根据需要除以 100000000 转换成浮点格式。浮点值当然还是有精度限制的,但是每一个都是整数对应的转换结果,整数值没有任何精度问题,因此每次递增时都不会累积错误。

于 2013-06-03T13:13:20.087 回答
0

一种快速的方法是:

double myNumber = 80.14666666;
myNumber += (1 / 10^8); // = 80.14666667

那是你要找的吗?

于 2013-06-03T13:11:23.347 回答
0

double 实际上并不包含您想象的确切值。这是因为基础字段被保存为二进制数,由于 1/5 的因素,不能包含十分之一。

相反,您可以使用 new BigDecimal("80.14666666") 并将其增加 new BigDecimal("0.00000001")。

请注意,我正在传递一个字符串来初始化这个对象。如果您传递一个双精度值,则 BigDecimal 将根据双精度值的值进行初始化,如上所述,该值不包含您想象的确切值。

于 2013-06-03T13:12:28.893 回答