报错:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
以及使用.divide不保留小数。
来源:
测试BigDecimal
解决:
BigDecimal的除法方法(分别表示,除数、保留scale位、进位模式):
public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode)
进位模式(保留2位举例):
BigDecimal.ROUND_HALF_UP:常规四舍五入,0.555->0.56
BigDecimal.ROUND_HALF_DOWN:四舍五入,5向下取整,0.555->0.55
BigDecimal.ROUND_UP:保留位数后有数直接进位,0.55xxxxxxxxxxxx->0.56
BigDecimal.ROUND_DOWN:直接不管保留位数后面的,0.55xxxxxxxxxxx->0.55
所以使用的时候记得完整设置。
System.out.println("除法:" + bigDecimal1.divide(bigDecimal2,2,BigDecimal.ROUND_HALF_UP));
总结
- 加法 .add
- 减法 .subtract
- 乘法 .multiply
- 除法 .divide (divide方法设置精确的小数点,如:divide(xxxxx,2))
- 比较 .compareTo
BigDecimal
的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal。- 尽量使用参数类型为String的构造函数。
- BigDecimal都是不可变的,每一次四则运算都会产生新的对象,要自己保存。