2017-10-09 381 views
1

我有下面的一段代码,我的精确度在将BigDecimal转换为String时丢失了。任何帮助,真的很感激。
预期结果:95.10000000000000%
实际结果:95.09999999999999%Java BigDecimal转为字符串

public static String getAsString(Object value) 
{ 
    if (value == null) 
     return null; 

    if (value.toString().length() == 0) 
     return null; 

    BigDecimal inputVal = new BigDecimal(value.toString()); 

    if (inputVal == new BigDecimal(0)) 
     return ""; 

    NumberFormat numberFormat = NumberFormat.getPercentInstance(Locale.US); 
    numberFormat.setMinimumFractionDigits(14); 
    numberFormat.setMaximumFractionDigits(14); 
    if (numberFormat instanceof DecimalFormat) { 
     DecimalFormat df = (DecimalFormat) numberFormat; 
     df.setNegativePrefix("("); 
     df.setNegativeSuffix("%)"); 
    } 

    String num = null; 
    num = numberFormat.format(new BigDecimal(95.1).divide(new BigDecimal(100))); 

    return num; 
} 
+0

你给什么输入它来重现问题? – marstran

+5

此外,'inputVal == new BigDecimal(0)'将始终失败。没有任何物体永远不会像新创造的物体一样。改用'equals'。 – marstran

+0

@marstran虽然你对错误的引用比较是正确的,但equals不是正确的使用方法,因为BigDecimal.equals中的equals是考虑了规模的(查看文档)。 您应该改用'BigDecimal.compareTo'。 –

回答

0

试试这个

BigDecimal inputVal = new BigDecimal(value.toString()).setScale(3, RoundingMode.HALF_UP); 
+0

它没有给出预期的结果。请检查你的答案。 – imk

1

您可以使用setScale,然后转换为字符串。

我看到你想要打印14位数字,所以设置比例为14,并使用四舍五入。

BigDecimal inputVal = new BigDecimal(95.10000000000000).setScale(14, RoundingMode.UP); 

然后调用toString并添加%等

7

有了这个实例创建

new BigDecimal(95.1) 

losing some precision。什么,你其实可以做的是使用字符串构造:

new BigDecimal("95.1") 

为你的情况的另一种方法是使用工厂方法:

BigDecimal.valueOf(95.1) 
BigDecimal.valueOf(100) 

内部这些使用这些数字的字符串表示创建BigDecimal对象。

+0

非常感谢,现在工作 –

1

在这种情况下,使用new BigDecimal(double x)double作为参数,碰巧双精度不能完全表示x.xxxx。因此x.xxxx被“转换”为最接近的可能的双倍数,即x.0000xxxxxxxxxxxzzzzzzzzzzyyyyy,这就是您的BigDecimal所展示的。

因此,这里的解决方案可能是您可以使用String构造函数或valueOf()方法创建您的double d值的标准表示。

通过改变你的线

num = numberFormat.format(new BigDecimal(95.1).divide(new BigDecimal(100))); 

num = numberFormat.format(BigDecimal.valueOf(95.1).divide(BigDecimal.valueOf(100))); 

num = numberFormat.format(new BigDecimal("95.1").divide(new BigDecimal("100"))); 

应该给你正确的结果。

0

您可以使用字符串值

num = numberFormat.format(new BigDecimal("95.1").divide(new BigDecimal("100")));