2012-12-16 97 views
38

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

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

输出为:

10.000099999999999766941982670687139034271240234375 
10.000099999999999766941982670687139034271240234375 

,我需要出去投入是完全数字10.0001字符串

回答

81

为了得到准确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)的问题是,所述参数是一个double和它发生双打不能代表10.0001准确。因此10.0001被“转换”为最接近的可能的双倍数,即10.000099999999999766941982670687139034271240234375,这就是您的BigDecimal所示。

因此,使用双重构造函数很少有意义。

你可以阅读更多关于它在这里,Moving decimal places over in a double

+0

的更有效的方法通过这种方式转换'double'就是使用'BigDecimal.valueOf(double);' –

+0

@PeterLawrey不知道我明白。 'BigDecimal.valueOf(double)''以相同的方式将double转换为“double”,打印时会变成四舍五入,这使用了一些复杂的规则,所以我不确定如何依赖它。 – assylias

+0

'使用Double.toString(double)方法提供的double的规范字符串表示形式将double翻译为BigDecimal。 注意:这通常是将double(或float)转换为BigDecimal的首选方式,因为返回值等于从使用Double.toString(double)结果构造BigDecimal所产生的值。# –

8

BigDecimal不包含数字10.0001,因为你有double初始化它,并且double没有相当包含数字,你认为它没有。 (这是BigDecimal整点)。

如果使用the string-based constructor代替:

BigDecimal bd = new BigDecimal("10.0001"); 

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

0

BigDecimal不能是双精度。 你可以使用Int号码。 如果要显示自己的编号,可以使用BigDecimal的String构造函数。

这样的:

BigDecimal bd1 = new BigDecimal("10.0001"); 
现在

,可以显示BD1为10.0001

那么简单。 好运。

5

通过使用下面的方法,您可以将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

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); 
0

要存档双构造的必然结果,你需要前圆BigDecimal在将其转换为字符串如

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

将打印 “10.0001”

0

为了更好地支持不同的地区用这种方式:

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

df.format(bigDecimal); 

还可以自定义它:

DecimalFormat df = new DecimalFormat("###,###,###"); 
df.format(bigDecimal); 
相关问题