大十进制数减法不起作用

时间:2017-10-14 13:24:21

标签: bigdecimal subtraction

我在下面的程序中遇到了简单的问题。在下面的代码中,我只是减去数字,预期的输出是" 89.50"但它打印90.我可以知道原因并帮助我获得预期输出的代码。

public class BigDecimal_Prb {

  public static void main(String[] args) throws java.lang.Exception
  {
    MathContext mc = new MathContext(2); 
    List<BigDecimal> list = new ArrayList<BigDecimal>();
    list.add(BigDecimal.valueOf(30));
    list.add(BigDecimal.valueOf(120.00));

    BigDecimal [] nums = (BigDecimal[]) list.toArray(new BigDecimal[0]);
    BigDecimal reaminingAmt=nums[1].subtract(nums[0], mc);
    BigDecimal dedAmt=new BigDecimal(0.5);
    BigDecimal ans = reaminingAmt.subtract(dedAmt,mc);
    System.out.println(ans);
  }
}

2 个答案:

答案 0 :(得分:1)

减法肯定有效,但你做的其他事情会导致“意外”结果。

MathContext包含两个主要元素: 精确度 舍入模式。我猜您理解舍入模式,但不理解精度

精度BigDecimal有效数字的数量。换句话说,如果您将其设置为2,则可以将数字舍入为两位数,即90。如果您想在小数点后面有一定数量的数字,请使用比例:

BigDecimal ans = reaminingAmt.subtract(dedAmt).setScale(2);

答案 1 :(得分:0)

是肯定的。终于明白了。

不,它不是缩放问题。 &#34;解决方案&#34;我发现有改变BigDecimal.toString()方法的结果的副作用。但是,setScale()的目的是微调对BigDecimal值执行的内部计算的结果。如果您只想要BigDecimal的比例为2,因为计算结果需要的只是可以接受的,那就没问题,设置比例。但是,如果您使用setScale(),那么您的输出将显示&#34; 120.00&#34;而不是&#34; 120.0,&#34;然后你出于错误的原因使用错误的做法,IMO。

如果您需要2的比例,请更改所有实例创建以使用BigDecimal(String)构造函数。这将保留.00部分,然后您将获得您一直在寻找的2的比例。

public class BigDecimal_Prb {

public static void main(String[] args) throws java.lang.Exception
   {
    MathContext mc = new MathContext(4, RoundingMode.HALF_DOWN); 
    List<BigDecimal> list = new ArrayList<BigDecimal>();
    list.add(BigDecimal.valueOf(30));
    list.add(BigDecimal.valueOf(120.00));

    BigDecimal [] nums = (BigDecimal[]) list.toArray(new BigDecimal[0]);
    BigDecimal reaminingAmt=nums[1].subtract(nums[0], mc);
    BigDecimal dedAmt=new BigDecimal(0.5);
    BigDecimal ans = reaminingAmt.subtract(dedAmt,mc).setScale(2, RoundingMode.HALF_DOWN);
    System.out.println(ans.toString());
   }
}