69

我有一个 BigDecimal 对象,我想将其转换为字符串。问题是我的值得到了分数,我得到了一个巨大的数字(长度),我只需要字符串中的原始数字,例如:

BigDecimal bd = new BigDecimal(10.0001)
System.out.println(bd.toString());
System.out.println(bd.toPlainString());

输出是:

10.000099999999999766941982670687139034271240234375
10.000099999999999766941982670687139034271240234375

我需要输出正好是10.0001字符串中的数字

4

8 回答 8

132

要准确获得,10.0001您需要使用 String 构造函数或valueOf(它基于双精度的规范表示构造一个 BigDecimal):

BigDecimal bd = new BigDecimal("10.0001");
System.out.println(bd.toString()); // prints 10.0001
//or alternatively
BigDecimal bd = BigDecimal.valueOf(10.0001);
System.out.println(bd.toString()); // prints 10.0001

问题new BigDecimal(10.0001)在于参数是 adouble并且碰巧双打不能10.0001准确表示。因此10.0001,“转换”为最接近的双倍,这就是10.000099999999999766941982670687139034271240234375你所BigDecimal展示的。

出于这个原因,使用双重构造函数几乎没有意义。

您可以在此处阅读有关它的更多信息,将小数位移动到双精度

于 2012-12-16T09:57:32.210 回答
13

BigDecimal不包含 number 10.0001,因为您使用 a 对其进行了初始化double,而 thedouble并没有完全包含您认为它包含的数字。(这就是 的重点BigDecimal。)

如果您改用基于字符串的构造函数

BigDecimal bd = new BigDecimal("10.0001");

...那么它实际上将包含您期望的数字。

于 2012-12-16T09:58:45.013 回答
9

为了更好地支持不同的语言环境,请使用以下方式:

DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2);
df.setMinimumFractionDigits(0);
df.setGroupingUsed(false);

df.format(bigDecimal);

你也可以自定义它:

DecimalFormat df = new DecimalFormat("###,###,###");
df.format(bigDecimal);
于 2016-07-12T08:46:57.867 回答
8

通过使用下面的方法,您可以将 java.math.BigDecimal 转换为 String。

   BigDecimal bigDecimal = new BigDecimal("10.0001");
   String bigDecimalString = String.valueOf(bigDecimal.doubleValue());
   System.out.println("bigDecimal value in String: "+bigDecimalString);

输出:
字符串中的 bigDecimal 值:10.0001

于 2014-06-13T18:07:04.890 回答
1
// Convert BigDecimal number To String by using below method //

public static String RemoveTrailingZeros(BigDecimal tempDecimal)
{
    tempDecimal = tempDecimal.stripTrailingZeros();
    String tempString = tempDecimal.toPlainString();
    return tempString;
}

// Recall RemoveTrailingZeros
BigDecimal output = new BigDecimal(0);
String str = RemoveTrailingZeros(output);
于 2014-06-28T13:44:52.213 回答
0

BigDecimal 不能是双精度数。您可以使用 Int 数。如果您想完全显示自己的数字,可以使用 BigDecimal 的 String 构造函数。

像这样:

BigDecimal bd1 = new BigDecimal("10.0001");

现在,您可以将 bd1 显示为 10.0001

很简单。祝你好运。

于 2012-12-21T15:19:25.210 回答
0

要使用双构造函数归档必要的结果,您需要在将 BigDecimal 转换为字符串之前对其进行舍入,例如

新 java.math.BigDecimal(10.0001).round(新 java.math.MathContext(6, java.math.RoundingMode.HALF_UP)).toString()

将打印“10.0001”

于 2016-04-18T13:28:45.667 回答
0

如果您只需要设置精度数量并舍入该值,那么正确的方法是使用它自己的对象。

BigDecimal value = new BigDecimal("10.0001");
value = value.setScale(4, RoundingMode.HALF_UP);
System.out.println(value); //the return should be "10.0001"

面向对象编程(OOP)的支柱之一是“封装”,这个支柱还说对象应该处理它自己的操作,就像这样:

于 2019-05-10T15:49:43.193 回答