java Double Division与BigDecimal round half_up half_down

时间:2014-05-10 12:30:48

标签: java

我知道这个话题已经完全涵盖了。但是当我阅读BigDecimal主题的答案时,我感到困惑。 我希望你不要生气我正在开始这个话题。

我正在创建一个程序,用几个数字进行一个非常简单的除法。我有两个代表金钱总和的变量。变量和答案的精度在零(x.xxxxx)之后是5位数。我希望我的答案尽可能精确(零后仍为5位数,但精确舍入)。

所以有我的示例代码:

public static void main(String[] args) {
        double a =1.0;
        double b =3.0;
        double c;
        c=(double)Math.round((a/b)*100000)/100000;
        System.out.println(c); //prints 0.33333

        BigDecimal d= new BigDecimal("1.0");
        BigDecimal e = new BigDecimal("3.0");
        BigDecimal f;
        f=d.divide(e, 5, RoundingMode.HALF_DOWN);
        System.out.println(f);//prints 0.33333

        BigDecimal k = new BigDecimal(1.0);
        BigDecimal l = new BigDecimal(3.0);
        BigDecimal m;
        m=k.divide(l, 5, RoundingMode.HALF_DOWN);
        System.out.println(m);//prints 0.33333

        BigDecimal o= new BigDecimal("1.0");
        BigDecimal p = new BigDecimal("3.0");
        BigDecimal q;
        q=o.divide(p, 5, RoundingMode.HALF_UP);
        System.out.println(q);//prints 0.33333

    }

问题1:为什么RoundingMode.HALF_DOWN给出与RoundingMode.HALF_UP相同的答案。他们不应该给出0.33334。 问题2:在这种情况下,当我比较两个双打并用力将它们四舍五入到使用BigDecimal HALF_DOWN时,在这种情况下是否存在差异。 问题3:当我使用带字符串的bigdecimal构造函数而不是double时,不应该有区别。在哪种情况下有区别? 问题4:你在计算金钱时建议采用哪种方法,为什么?

谢谢。 :)

2 个答案:

答案 0 :(得分:2)

当您将1.0除以3.0时,结果为0.333333333 ...如果您阅读规范,您将看到ROUND_HALF_UP和ROUND_HALF_DOWN仅在丢弃的分数恰好为0.5时产生不同的结果,否则它们的行为相同。所以你看到了人们的期望。

如果您正在计算具有任何实际意义的资金(生成财务报告,计算销售税等),那么您需要了解在您的情况下合法预期的舍入模式。不要成为牛仔。

答案 1 :(得分:0)

尝试使用BigDecimal.ROUND_CEILINGBigDecimal.ROUND_FLOOR

f=d.divide(e, 5, BigDecimal.ROUND_FLOOR);
m=k.divide(l, 5, BigDecimal.ROUND_FLOOR);
q=o.divide(p, 5, BigDecimal.ROUND_CEILING);

而不是RoundingMode.HALF_UPRoundingMode.HALF_DOWN

f=d.divide(e, 5, RoundingMode.HALF_DOWN);
m=k.divide(l, 5, RoundingMode.HALF_DOWN);
q=o.divide(p, 5, RoundingMode.HALF_UP);

输出

0.33333
0.33333
0.33334