在java中使用numberFormat.parse("")方法时输出错误

时间:2017-10-18 04:00:02

标签: java

我有以下代码:

我正在传递价值" 55.00000000000000"并获得55.00000000000001的输出。

但是当我通过" 45.00000000000000"和" 65.00000000000000"我的输出为45.0和65.0。

有人可以帮我把正确的输出设为55.0。

NumberFormat numberFormat = NumberFormat.getPercentInstance(Locale.US);
if (numberFormat instanceof DecimalFormat) {
    DecimalFormat df = (DecimalFormat) numberFormat;
    df.setNegativePrefix("(");
    df.setNegativeSuffix("%)");
}
Number numericValue = numberFormat.parse("55.00000000000000%");
numericValue = new Double(numericValue.doubleValue() * 100);
System.out.println(numericValue);

2 个答案:

答案 0 :(得分:1)

这里的问题是numericValue在数学上应该是0.55。但是,它将是Double(因为numberFormat.parse()只能返回LongDouble)。而Double无法准确保持0.55的值。有关原因的完整说明,请参阅this link。结果是,当您使用不精确的值进行进一步计算时,将发生舍入错误,这就是打印输出的结果不是确切值的原因。 (A Double也不能正好是0.45或0.65;只是当乘以100时,结果会舍入到正确的整数。)

在处理金钱或百分比等十进制值时,最好使用BigDecimal。如果NumberFormatDecimalFormat,您可以进行设置,以便parse返回BigDecimal

if (numberFormat instanceof DecimalFormat) {
    DecimalFormat df = (DecimalFormat) numberFormat;
    df.setNegativePrefix("(");
    df.setNegativeSuffix("%)");
    df.setParseBigDecimal(true);   // ADD THIS LINE
}

现在,当您使用numberFormat.parse()时,它返回的Number将是BigDecimal,它可以保存精确值0.55。现在您必须避免将其转换为double,这将引入舍入错误。相反,你应该说像

Number numericValue = numberFormat.parse("55.00000000000000%");
if (numericValue instanceof BigDecimal) {
    BigDecimal bdNumber = (BigDecimal) numericValue;
    // use BigDecimal operations to multiply by 100, then print or format
    // or whatever you want to do
} else {
    // you're stuck doing things the old way, you might get some 
    // inaccuracy
    numericValue = new Double(numericValue.doubleValue() * 100);
    System.out.println(numericValue);
}

答案 1 :(得分:0)

使用这行代码

System.out.println(String.format("%.1f", numericValue));

格式化方法用于格式化数据。