考虑到 的行为BigDecimal(double)
是正确的,在我看来,我不太确定它是否真的会成为这样的问题。
我不完全同意BigDecimal(double)
构造函数中文档的措辞:
此构造函数的结果可能有些不可预测。有人可能会假设new
BigDecimal(0.1)
用 Java 编写的 a
BigDecimal
完全等于
0.1
(一个未缩放的值1
,比例为1
),但它实际上等于
0.1000000000000000055511151231257827021181583404541015625
。
(强调补充。)
与其说不可预测,我认为措辞应该是出乎意料的,即便如此,对于那些不知道用浮点值表示十进制数的限制的人来说,这将是出乎意料的行为。
只要记住浮点值不能精确地表示所有十进制值,使用BigDecimal(0.1)
being返回的值0.1000000000000000055511151231257827021181583404541015625
实际上是有意义的。
如果构造函数BigDecimal
实例化的对象BigDecimal(double)
是一致的,那么我认为结果是可预测的。
我猜测为什么BigDecimal(double)
构造函数没有被弃用是因为行为可以被认为是正确的,只要知道浮点表示是如何工作的,构造函数的行为就不会太令人惊讶。