ArithmeticException 在 BigDecimal.divide 期间抛出
我认为java.math.BigDecimal
应该是对使用十进制数执行无限精度算术的需求的答案™。
请考虑以下代码段:
import java.math.BigDecimal;
//...
final BigDecimal one = BigDecimal.ONE;
final BigDecimal three = BigDecimal.valueOf(3);
final BigDecimal third = one.divide(three);
assert third.multiply(three).equals(one); // this should pass, right?
我希望通过,但实际上执行甚至没有到达那里:导致被抛出!assert
one.divide(three)
ArithmeticException
Exception in thread "main" java.lang.ArithmeticException:
Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide
事实证明,此行为在 API 中明确记录:
在 的情况下,精确商可以有一个无限长的十进制展开;例如,1 除以 3。如果商具有非终止十进制展开,并且指定运算以返回确切的结果,则抛出 。否则,将返回除法的确切结果,就像其他操作一样。
divide
ArithmeticException
进一步浏览API,发现实际上存在各种重载,执行不精确的划分,即:divide
final BigDecimal third = one.divide(three, 33, RoundingMode.DOWN);
System.out.println(three.multiply(third));
// prints "0.999999999999999999999999999999999"
当然,现在显而易见的问题是“有什么意义???”。当我们需要精确的算术时,我认为这是解决方案,例如用于财务计算。如果我们甚至不能完全做到,那么这有多大用处?它是否真的用于一般目的,或者它仅在非常小众的应用程序中有用,幸运的是,您根本不需要这样做?BigDecimal
divide
divide
如果这不是正确的答案,那么我们可以在财务计算中使用什么来精确划分?(我的意思是,我没有金融专业,但他们仍然使用部门,对吧???)。