Java BigDecimal到String

时间:2017-10-09 09:30:21

标签: java bigdecimal

我有以下代码,在将BigDecimal转换为String时,我的精确度会丢失。对此的任何帮助都非常感谢。
预期结果:95.10000000000000%
实际结果:95.09999999999999%

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;
}

5 个答案:

答案 0 :(得分:8)

使用此实例创建

new BigDecimal(95.1)
你是losing some precision。你实际上可以做的是使用字符串构造函数:

new BigDecimal("95.1")

另一种方法是使用工厂方法:

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

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

答案 1 :(得分:1)

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

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

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

然后拨打toString并添加%等。

答案 2 :(得分: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")));

应该给你正确的结果。

答案 3 :(得分:1)

您可以使用字符串值

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

答案 4 :(得分:0)

试试这个

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