使用Bigdecimal 做除法
public static void main(String[] args) { // 1、不设置保留位数 System.out.println(BigDecimal.valueOf(2).divide(BigDecimal.valueOf(3))); // 2、divide以后再设置保留位数 System.out.println(BigDecimal.valueOf(2).divide(BigDecimal.valueOf(3)).setScale(2, RoundingMode.HALF_UP)); }
出现报错信息:
Exception in thread "main" java.lang.ArithmeticException:
Non-terminating decimal expansion; no exact representable decimal result.
异常原因:
Java 中使用 BigDecimal 做除法运算的时候,值有可能是无限循环的小数;
正确写法:需要在 divide 方法中传递另外两个参数 【scale】、【roundingMode】,来定义小数点后的精确位数
public static void main(String[] args) { // 1、不设置保留位数 // System.out.println(BigDecimal.valueOf(2).divide(BigDecimal.valueOf(3))); // 2、divide以后再设置保留位数 // System.out.println(BigDecimal.valueOf(2).divide(BigDecimal.valueOf(3)).setScale(2, RoundingMode.HALF_UP)); // 3、正确写法 System.out.println(BigDecimal.valueOf(2).divide(BigDecimal.valueOf(3), 2, RoundingMode.HALF_UP)); }
舍入模式:
1、ROUND_UP
直接舍去非零的小数位数,对整数位 +1。
2、ROUND_DOWN
直接舍去小数位数,不对整数位 +1。
3、ROUND_CEILING
如果结果为正数,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同。
4、ROUND_FLOOR
如果结果为正数,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。
5、ROUND_HALF_UP(四舍五入)
如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
6、ROUND_HALF_DOWN
如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。
7、ROUND_HALF_EVEN
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入;如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
8、ROUND_UNNECESSARY
断言请求的操作具有精确的结果,因此不需要舍入。不舍位 . 精度位数小于小数位数会抛出异常。
标签:舍入,Non,BigDecimal,no,decimal,valueOf,UP,ROUND,divide From: https://www.cnblogs.com/wongzzh/p/18459966