首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DecimalFormat返回错误结果

DecimalFormat返回错误结果
EN

Stack Overflow用户
提问于 2016-08-18 10:30:31
回答 3查看 750关注 0票数 1

有人知道我做错了什么吗?我得到了一个浮点数,假设它是0.04。在格式化之后,它变成0.03。显然,输出结果已经比输入结果低0.01。

下面是我的代码:

代码语言:javascript
复制
float creditAvailableProportion = this.accountSummary != null ? (this.accountSummary.getCreditAvailable()/this.accountSummary.getCreditLimit()) : 0;
        DecimalFormat decimalFormat =  new DecimalFormat("#.##");
        decimalFormat.setRoundingMode(RoundingMode.FLOOR);
        float formattedCreditAvailableProportion = Float.parseFloat(decimalFormat.format(creditAvailableProportion));

        return Math.min(1.0f, formattedCreditAvailableProportion);

提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2016-08-18 13:01:37

由于没有人解释这个问题,让我简要地解释一下发生了什么。在包括java在内的大多数系统中,浮点数都不是精确的。这意味着.04在内部被存储为例如.03999999999或.040000001或类似的东西。因此,当您使用floor格式对其进行格式化时,您可能最终会得到.03。解决方案是使用四舍五入格式,或者在格式之前将.0000001添加到值中。那样的话,即使是floor也会做对。

另一种方法是,如果可能的话,完全丢弃浮点数,并使用整数(如1e6),类似于Android对地理坐标的处理。

票数 2
EN

Stack Overflow用户

发布于 2016-08-18 10:51:57

如何调试:

运行这段代码,它应该会让你的问题变得清晰:

代码语言:javascript
复制
float creditAvailableProportion = this.accountSummary != null ? (this.accountSummary.getCreditAvailable()/this.accountSummary.getCreditLimit()) : 0;
System.out.println(creditAvailableProportion)              //Original value
DecimalFormat decimalFormat =  new DecimalFormat("#.##");
decimalFormat.setRoundingMode(RoundingMode.FLOOR);
String temp = decimalFormat.format(creditAvailableProportion);
System.out.println(temp);                                      //formatted string
float formattedCreditAvailableProportion = Float.parseFloat(decimalFormat.format(creditAvailableProportion));
System.out.println(formattedCreditAvailableProportion);         //Parsed float.

return Math.min(1.0f, formattedCreditAvailableProportion);

希望这篇文章能教会你如何钓鱼。

票数 0
EN

Stack Overflow用户

发布于 2016-08-18 11:01:50

此外,您还可以尝试使用Math.floor()。把它变成一个字符串或者其他什么都没有用。

代码语言:javascript
复制
float temp = 7.888888f;
temp = temp * 100;
        temp = (float) Math.floor((double)temp);
        temp = temp /100;
        System.out.println(temp);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39009074

复制
相关文章

相似问题

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