我有以下代码,在将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;
}
答案 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);