BigDecimal类setScale方法问题:算数异常,精确度丢失-ArithmeticException: Rounding necessary
在运行如下代码时,
package BigDecimal精确度;
import java.math.BigDecimal;
public class BigDecimalSetSacle {
public static void main(String[] args) {
BigDecimal decimal = new BigDecimal("58.33888");
BigDecimal result = decimal .setScale(2);
System.out.println(result);
}
}
会报算数异常:
Exception in thread "main" java.lang.ArithmeticException: Rounding necessary
at java.math.BigDecimal.commonNeedIncrement(BigDecimal.java:4148)
at java.math.BigDecimal.needIncrement(BigDecimal.java:4204)
at java.math.BigDecimal.divideAndRound(BigDecimal.java:4112)
at java.math.BigDecimal.setScale(BigDecimal.java:2452)
at java.math.BigDecimal.setScale(BigDecimal.java:2512)
at BigDecimal精确度.BigDecimalSetSacle.main(BigDecimalSetSacle.java:9)
原因是:没有设置mode,setScale方法,不给mode时,默认会设置mode为:ROUND_UNNECESSARY
但是ROUND_UNNECESSARY,在精确度丢失时,抛出异常。
所以,如果需要使用setScale方法,建议根据需要传入指定的mode,不要使用默认,否则会抛出异常!
默认的setScale(int newSacle)方法,只要参数的newSacle的大小,比this的小数点后位数小,则会抛出异常。