我在下面的程序中面临简单的问题。在下面的代码中,我只是减去数字,预期输出是“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);
}
}
是的。终于得到了。
不,这不是缩放问题。我发现的“解决方案”具有更改 BigDecimal.toString() 方法结果的副作用。但是,setScale() 的目的是微调对 BigDecimal 值执行的内部计算的结果。如果您只希望 BigDecimal 的比例为 2,因为这是您可以接受计算结果所需要的全部,那很好,请设置比例。但是,如果您使用 setScale() 以便您的输出显示“120.00”而不是“120.0”,那么您使用了错误的方法并且出于错误的原因而这样做,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());
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句