在java中将字符串转换为BigDecimal

Har*_*Rao 41 java bigdecimal

我正在读取XMLJava中的货币.

String currency = 135.69;
Run Code Online (Sandbox Code Playgroud)

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

 System.out.println(new BigDecimal(135.69));
Run Code Online (Sandbox Code Playgroud)

输出:

135.68999999999999772626324556767940521240234375.
Run Code Online (Sandbox Code Playgroud)

为什么输出这么多数字呢?我怎么能避免这个?我想要的只是输出135.69.

Mar*_*ick 87

BigDecimal(double)构造函数有一些问题,最好使用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
Run Code Online (Sandbox Code Playgroud)

BigDecimal(double)文档解释了这种行为:

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

  • 在这种情况下,我将使用 new BigDecimal (“string_value”)。这样,它对于整数和小数都可以正确运行。 (2认同)

Sir*_*uti 25

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

//will print 135.69
Run Code Online (Sandbox Code Playgroud)