基本上,我不明白为什么下面的代码在4.35 * 100 = 435.0时输出434,转换为435的int,对吧?
对此有什么简单的解释,这是一个经常出现的问题吗?
你会如何解决这个问题?
public class RoundOffDemo {
public static void main(String[] args) {
double price = 4.35;
int cents = (int) (100 * price); // Should be 435
System.out.println(cents); // Prints 434!
}
}
答案 0 :(得分:7)
问题是4.35无法用二进制表示。所以4.35 * 100并不完全是435.0。 (二进制中的每个分数都是2的反幂之和,所有这些都是终止小数。不幸的是,0.35十进制有一个非终止的二进制扩展。所以4.35更像是4.349999 ... x(其中 x < / em>是一切都超出一切的东西,由机器的浮点数的有限表示提供。)整数截断然后产生434.你可以使用Math.round()
来避免这个问题。
答案 1 :(得分:2)
IMO,使用BigDecimal的建议是过度的。对于美分,使用长。即使美国国债也可以用很长的时间来弥补。
如果使用浮点数(或双精度数),转换为整数时,请根据需要使用Math.round(),Math.floor()或Math.ceil()。
答案 2 :(得分:0)
这是浮点运算的结果。 (int
)投射不是舍入函数,而是@Ted指出的截断。
由于您正在处理资金(从您的变量名称中可以明显看出),请使用BigDecimal。
例如 -
double d = 4.35;
BigDecimal bd = BigDecimal.valueOf(d);
bd = bd.multiply(new BigDecimal(100));
答案 3 :(得分:0)
如果您使用此代码:
System.out.println(price*100); // Prints 434!
你注意到它的输出是
圆形的434.99999999999994
是434
答案 4 :(得分:0)
双值4.35实际表示为4.349999999999999。 100 * 4.349999999999999 = 434.9999999999999。 并将其转换为int值将为您提供434.
答案 5 :(得分:-1)
不要在Java中使用double / float进行浮点运算,而是使用BigDecimal。这是因为Java不能精确地表示浮点数。
始终将BigDecimal用于临时变量,这些变量将在未来的计算中处理/参与。如果要将值保存到数据库中,则仅将值转换为float / double。