我知道这个话题已经完全涵盖了。但是当我阅读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:你在计算金钱时建议采用哪种方法,为什么?
谢谢。 :)
答案 0 :(得分:2)
当您将1.0除以3.0时,结果为0.333333333 ...如果您阅读规范,您将看到ROUND_HALF_UP和ROUND_HALF_DOWN仅在丢弃的分数恰好为0.5时产生不同的结果,否则它们的行为相同。所以你看到了人们的期望。
如果您正在计算具有任何实际意义的资金(生成财务报告,计算销售税等),那么您需要了解在您的情况下合法预期的舍入模式。不要成为牛仔。
答案 1 :(得分:0)
尝试使用BigDecimal.ROUND_CEILING
和BigDecimal.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_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