我有一个类似于 80.14666666666668 的双变量,然后我使用 floor 函数将其截断为 8 位数字,例如 80.14666666。现在我想增加这个值并得到答案 80.14666667
4 回答
您可能不知道double
s 的真实性质。他们没有“数字”;它们是有理数的紧凑二进制编码。因此,您会发现很难以编程方式确定 a 的“最后一位”是什么double
。
如果您的特定需求只是四舍五入,请使用该round
函数而不是truncate
; 否则考虑使用 a BigDecimal
,它真正代表一个带有十进制数字的数字。
只需在数字上加上 0.00000001。
但是,浮点值不太适合这样的计数。每次增加它时,都会增加一个差异,因为像这样的数字仅在浮点数中近似表示。
如果要增加数字,请改用整数。将该数字乘以 100000000 并将其转换为整数,从而得到 8014666666。现在您可以将整数加一而不会引入任何错误。保持整数递增,根据需要除以 100000000 转换成浮点格式。浮点值当然还是有精度限制的,但是每一个都是整数对应的转换结果,整数值没有任何精度问题,因此每次递增时都不会累积错误。
一种快速的方法是:
double myNumber = 80.14666666;
myNumber += (1 / 10^8); // = 80.14666667
那是你要找的吗?
double 实际上并不包含您想象的确切值。这是因为基础字段被保存为二进制数,由于 1/5 的因素,不能包含十分之一。
相反,您可以使用 new BigDecimal("80.14666666") 并将其增加 new BigDecimal("0.00000001")。
请注意,我正在传递一个字符串来初始化这个对象。如果您传递一个双精度值,则 BigDecimal 将根据双精度值的值进行初始化,如上所述,该值不包含您想象的确切值。