为什么Java的"新BigDecimal(double)"已被弃用?

dro*_*p27 -1 java double bigdecimal

来自BigDecimal的构造函数

这个构造函数的结果可能有点不可预测.有人可能会假设在Java中编写新的BigDecimal(0.1)会创建一个BigDecimal,它恰好等于0.1(未缩放值为1,标度为1),但它实际上等于0.1000000000000000055511151231257827021181583404541015625.这是因为0.1不能精确地表示为double(或者,就此而言,作为任何有限长度的二进制分数).因此,传递给构造函数的值并不完全等于0.1,尽管有外观.

另一方面,String构造函数是完全可预测的:写入新的BigDecimal("0.1")会创建一个BigDecimal,它正好等于0.1,正如人们所期望的那样.因此,通常建议优先使用String构造函数.

当double必须用作BigDecimal的源时,请注意此构造函数提供了精确的转换; 它不会产生与使用Double.toString(double)方法将double转换为String然后使用BigDecimal(String)构造函数相同的结果.要获得该结果,请使用static valueOf(double)方法.

那么他们为什么不弃用它并将功能更改为valueOf(double)?创造出不可预测价值的重点是什么?

Lew*_*och 5

这完全可以预测.您可以准确地获得构造函数参数中提供的值.对于双字面0.1" 0.1正如你所引用的那样,传递给构造函数的值并不完全等于".构造函数忠实地获取传入的值.可预测.

  • 它对于研究浮点行为非常非常有用. (3认同)