我有以下代码:
我正在传递价值" 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);
答案 0 :(得分:1)
这里的问题是numericValue
在数学上应该是0.55。但是,它将是Double
(因为numberFormat.parse()
只能返回Long
或Double
)。而Double
无法准确保持0.55的值。有关原因的完整说明,请参阅this link。结果是,当您使用不精确的值进行进一步计算时,将发生舍入错误,这就是打印输出的结果不是确切值的原因。 (A Double
也不能正好是0.45或0.65;只是当乘以100时,结果会舍入到正确的整数。)
在处理金钱或百分比等十进制值时,最好使用BigDecimal
。如果NumberFormat
是DecimalFormat
,您可以进行设置,以便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));
格式化方法用于格式化数据。