在java中将字符串转换为BigDecimal

2022-08-31 11:43:10

我正在从Java中读取货币。XML

String currency = "135.69";

当我将其转换为我得到:BigDecimal

 System.out.println(new BigDecimal(135.69));

输出:

135.68999999999999772626324556767940521240234375.

为什么它输出这么多数字?我该如何避免这种情况?我想要的只是让它输出135.69。


答案 1

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)的文档详细解释了:

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

答案 2
String currency = "135.69";
System.out.println(new BigDecimal(currency));

//will print 135.69

推荐