首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java BigDecimal to String

Java BigDecimal to String
EN

Stack Overflow用户
提问于 2017-10-09 17:30:21
回答 5查看 7.6K关注 0票数 2

我有下面的一段代码,我的精度在将BigDecimal转换为String时丢失了。在这方面的任何帮助都是非常感谢的。

预期结果:95.10000000000000%

实际结果:95.09999999999999%

代码语言:javascript
复制
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;
}
EN

回答 5

Stack Overflow用户

发布于 2017-10-09 17:42:49

使用此实例创建

代码语言:javascript
复制
new BigDecimal(95.1)

你是losing some precision。您实际可以做的是使用string构造函数:

代码语言:javascript
复制
new BigDecimal("95.1")

对于您的情况,另一种方法是使用工厂方法:

代码语言:javascript
复制
BigDecimal.valueOf(95.1)
BigDecimal.valueOf(100)

在内部,它们使用这些数字的字符串表示来创建BigDecimal对象。

票数 11
EN

Stack Overflow用户

发布于 2017-10-09 17:48:56

在这种情况下,使用new BigDecimal(double x)double作为参数,并且doubles不能准确地表示x.xxxx。因此,x.xxxx被“转换”为最接近的替身,即x.0000xxxxxxxxxxxzzzzzzzzzzyyyyy,这就是您的BigDecimal所显示的。

因此,这里的解决方案可能是您可以使用String构造函数或valueOf()方法来创建doubled值的规范表示。

通过改变你的线路

代码语言:javascript
复制
num = numberFormat.format(new BigDecimal(95.1).divide(new BigDecimal(100)));

代码语言:javascript
复制
num = numberFormat.format(BigDecimal.valueOf(95.1).divide(BigDecimal.valueOf(100)));

代码语言:javascript
复制
num = numberFormat.format(new BigDecimal("95.1").divide(new BigDecimal("100")));

应该会给你正确的结果。

票数 3
EN

Stack Overflow用户

发布于 2017-10-09 17:34:26

尝尝这个

代码语言:javascript
复制
 BigDecimal inputVal = new BigDecimal(value.toString()).setScale(3, RoundingMode.HALF_UP);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46643122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档