java双除法与大十进制四舍五入上半下半

java双除法与大十进制四舍五入上半下半,java,Java,我知道这个话题涉及面很广。但是当我读到大十进制主题的答案时,我感到困惑。 我希望你不要生气,我是从这个话题开始的 我正在创建一个程序,用几个数字做一个非常简单的除法。我有两个变量代表钱的总和。变量和答案的精度为零后5位(x.xxxxx)。我希望我的答案尽可能精确(仍然是零后5位,但精确四舍五入) 下面是我的示例代码: public static void main(String[] args) { double a =1.0; double b =3.0;

我知道这个话题涉及面很广。但是当我读到大十进制主题的答案时,我感到困惑。 我希望你不要生气,我是从这个话题开始的

我正在创建一个程序,用几个数字做一个非常简单的除法。我有两个变量代表钱的总和。变量和答案的精度为零后5位(x.xxxxx)。我希望我的答案尽可能精确(仍然是零后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:你建议用哪种方法计算金钱,为什么


谢谢。:)

尝试使用
BigDecimal.ROUND\u天花板
BigDecimal.ROUND\u地板

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_UP
RoundingMode.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

当你用1.0除以3.0,结果是0.333。。。如果您阅读规范,您将看到,如果丢弃分数正好为0.5,则向上取整和向下取整只会产生不同的结果,否则它们的行为相同。所以你看到了人们的期望

如果您正在对具有任何实际意义的资金进行计算(生成财务报告、计算销售税等),那么您需要了解在您的情况下法律上预期的四舍五入模式。别当牛仔