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