为什么BigDecimal构造函数实例具有不同的值



我不知道为什么会这样:

float flo = 196.7f;
BigDecimal bd = new BigDecimal(flo);
System.out.println(bd); //print 196.6999969482421875
BigDecimal bd2 = new BigDecimal(Float.toString(flo));
System.out.println(bd2); //print 196.7

您的两个问题在Javadoc中都有明确的说明。

  1. 这个构造函数的结果可能有些不可预测。有人可能会认为在Java中编写新的BigDecimal(0.1)会创建一个BigDecimal恰好等于0.1(一个未缩放的值1)尺度为1),但实际上等于0.1000000000000000055511151231257827021181583404541015625. 这是因为0.1不能精确地表示为双精度数物质,作为任何有限长度的二进制分数)。因此,值传递给构造函数的不完全等于0.1,尽管外表如此。
  2. 另一方面,String构造函数是完全可预测的:写入new BigDecimal("0.1")将创建一个BigDecimal正好等于0.1,正如我们所料。因此,它是一般建议使用String构造函数

最新更新