问题记录
由于 BigDecimal 是不可变的、任意精度的有符号十进制数,所以可以做精确计算。但在除法中,准确的商可能是一个无限长的十进制扩展(例如:1 除以 3 所得的商)。
若我们在做除法时,没有指定舍入模式,无法表示为准确的结果,则会抛出这个异常。(就是小数点后的位数不确定,不能无限长,否则抛异常)
问题解决
在divide()
方法中传入 MathContext
或RoundingMode
对象,指定精度和舍入模式。
示例:
BigDecimal divide = var1.divide(var2, RoundingMode.HALF_UP);
RoundingMode的八种模式:
模式 | 说明 | 示例 |
---|---|---|
ROUND_UP | 始终对非零舍弃部分前面的数字加1 | 例如:0.121 -> 0.13 |
ROUND_DOWN | 始终不对舍弃部位前面的数字加1,即截短 | 例如:0.129 -> 0.12 |
ROUND_CEILING | 若是正数,则舍入与ROUND_UP相同,若是负数,则舍入与ROUND_DOWN相同 | 例如:0.121 -> 0.13,-0.129 -> -0.12 |
ROUND_FLOOR | 若是正数,则舍入与ROUND_DOWN相同,若是负数,则舍入与ROUND_UP相同 | 例如:0.129 -> 0.12,-0.121 -> -0.13 |
ROUND_HALF_UP | 四舍五入 | 例如:0.124 -> 0.12,0.125 -> 0.13 |
ROUND_HALF_DOWN | 五舍六入 | 例如:0.125 -> 0.12,0.126 -> 0.13 |
ROUND_HALF_EVEN | 如果舍弃部分左边的数字为奇数,则与 ROUND_HALF_UP 相同; 如果为偶数,则与 ROUND_HALF_DOWN 相同。 | 例如:1.15 -> 1.2,1.25 -> 1.2 |
ROUND_UNNECESSARY | 断言请求的操作具有精确的结果,因此不需要舍入(如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException) | ArithmeticException |
参考文献:
1.【工具类】BigDecimal 8 种RoundingMode舍入模式详解:https://www.cnblogs.com/Mateo-dengmin/p/15837651.html