gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:07:21 26 4
gpt4 key购买 nike

我有下面的代码:

我传递值“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);

最佳答案

这里的问题是 numericValue 在数学上应该是 0.55。但是,它将是一个 Double (因为 numberFormat.parse() 只能返回一个 LongDouble )。而且 Double 无法准确保存值 0.55。请参阅this link完整解释原因。结果是,当您使用不精确的值进行进一步计算时,将会出现舍入错误,这就是为什么打印出来的结果不完全是精确的值。 (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);
}

关于java - 在java中使用numberFormat.parse ("")方法时得到错误的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46802583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com