我在下面的程序中遇到了简单的问题。在下面的代码中,我只是减去数字,预期的输出是" 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);
}
}
答案 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());
}
}