Java四舍五入问题

时间:2011-12-28 16:44:32

标签: java floating-point rounding floating-accuracy

基本上,我不明白为什么下面的代码在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!
    }
}

6 个答案:

答案 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)

  1. 不要在Java中使用double / float进行浮点运算,而是使用BigDecimal。这是因为Java不能精确地表示浮点数。

  2. 始终将BigDecimal用于临时变量,这些变量将在未来的计算中处理/参与。如果要将值保存到数据库中,则仅将值转换为float / double。