new BigDecimal(0.7)并 没有 代表0.7。
它代表0.69999999999999999999555910790149937383830547332763671875(精确)。
原因是
double文字
0.7不完全代表0.7。
如果需要 精确的
BigDecimal值,则 必须 使用
String构造函数(实际上, 所有
不使用
double值的构造函数都可以使用)。
试试吧
new BigDecimal("0.7")。构造函数的JavaDoc
BigDecimal(double)具有一些相关的注释:
此构造函数的结果可能有些不可预测。有人可能会假设使用
new BigDecimal(0.1)Java 编写的代码创建的aBigDecimal等于0.1(非标度值为1,小数位数为1),但实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1不能精确地表示为double(或就此而言,表示为任何有限长度的二进制分数)。因此,尽管出现,但是传递给构造函数的值并不完全等于0.1。该
String构造,在另一方面,是完全可以预测的:写作new BigDecimal("0.1")产生了BigDecimal这
恰好
等于0.1,正如人们所期望的那样。因此,通常建议优先使用该String构造函数。3.
当double必须将用作的源时BigDecimal,请注意,此构造函数提供了精确的转换。与使用方法然后使用构造函数将转换double为的结果不同。要获得该结果,请使用方法。StringDouble.toString(double)BigDecimal(String)staticvalueOf(double)
总结一下:如果要创建一个
BigDecimal具有固定十进制值的,请使用
String构造函数。如果您 已经有
一个
double值,那么
BigDecimal.valueOf(double)将提供比使用更直观的行为
newBigDecimal(double)。



