BigDecimal(双精度)构造函数可能具有不可预知的行为。最好使用 BigDecimal(String) 或 BigDecimal.valueOf(double)。
System.out.println(new BigDecimal(135.69)); //135.68999999999999772626324556767940521240234375
System.out.println(new BigDecimal("135.69")); // 135.69
System.out.println(BigDecimal.valueOf(135.69)); // 135.69
BigDecimal(double)的文档详细解释了:
- 此构造函数的结果可能有些不可预测。有人可能会假设在Java中编写新的BigDecimal(0.1)会创建一个正好等于0.1的BigDecimal(一个未缩放的值1,小数位数为1),但它实际上等于0.100000000000000000000055511151231257827021181583404541015625。这是因为 0.1 不能完全表示为双精度值(或者,就此而言,不能表示为任何有限长度的二进制分数)。因此,尽管外观不同,传递给构造函数的值并不完全等于 0.1。
- 另一方面,String构造函数是完全可预测的:编写新的BigDecimal(“0.1”)会创建一个正好等于0.1的BigDecimal,正如人们所期望的那样。因此,通常建议优先使用 String 构造函数而不是此构造函数。
- 当必须将双精度值用作 BigDecimal 的源时,请注意,此构造函数提供了精确的转换;它不会给出与使用 Double.toString(double) 方法然后使用 BigDecimal(String) 构造函数将 double 转换为 String 相同的结果。若要获取该结果,请使用静态值Of(double) 方法。