在java中将字符串转换为BigDecimal

问题描述:

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

I am reading a currency from XML into Java.

String currency = 135.69;

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

When I convert this to BigDecimal I get:

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

输出:

135.68999999999999772626324556767940521240234375.

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

Why is it that it outputs this many numbers? How can I avoid this? All I want is for it to output 135.69.

BigDecimal(双)构造函数有一些问题,你喜欢使用它BigDecimal(String)或BigDecimal.valueOf(double)。

The BigDecimal(double) constructor have some problems, is preferrable that you uses BigDecimal(String) or 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(双)文档解释了这种行为:

The BigDecimal(double) documentation explain about this behavior:



  1. 此构造函数的结果可能有些不可预测。有人可能会假设在Java中编写新的BigDecimal(0.1)会创建一个BigDecimal,它正好等于0.1(未缩放值为1,比例为1),但它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1不能精确地表示为double(或者,就此而言,作为任何有限长度的二进制分数)。因此,传递给构造函数的值并不完全等于0.1,尽管有外观。

  2. 另一方面,String构造函数是完全可预测的:编写新的BigDecimal( 0.1)创建一个BigDecimal,它正好等于0.1,正如人们所期望的那样。因此,通常建议优先使用String构造函数。

  3. 当必须将double用作BigDecimal的源时,请注意此构造函数提供了精确的转换;它不会产生与使用Double.toString(double)方法将double转换为String然后使用BigDecimal(String)构造函数相同的结果。要获得该结果,请使用静态valueOf(double)方法。