我有下面的一段代码,我的精度在将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;
}发布于 2017-10-09 17:42:49
使用此实例创建
new BigDecimal(95.1)你是losing some precision。您实际可以做的是使用string构造函数:
new BigDecimal("95.1")对于您的情况,另一种方法是使用工厂方法:
BigDecimal.valueOf(95.1)
BigDecimal.valueOf(100)在内部,它们使用这些数字的字符串表示来创建BigDecimal对象。
发布于 2017-10-09 17:48:56
在这种情况下,使用new BigDecimal(double x)和double作为参数,并且doubles不能准确地表示x.xxxx。因此,x.xxxx被“转换”为最接近的替身,即x.0000xxxxxxxxxxxzzzzzzzzzzyyyyy,这就是您的BigDecimal所显示的。
因此,这里的解决方案可能是您可以使用String构造函数或valueOf()方法来创建doubled值的规范表示。
通过改变你的线路
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")));应该会给你正确的结果。
发布于 2017-10-09 17:34:26
尝尝这个
BigDecimal inputVal = new BigDecimal(value.toString()).setScale(3, RoundingMode.HALF_UP);https://stackoverflow.com/questions/46643122
复制相似问题