Java DecimalFormat返回错误的结果

Java DecimalFormat返回错误的结果,java,android,math,decimalformat,Java,Android,Math,Decimalformat,有人知道我做错了什么吗?我有一个浮点数,假设是0.04。格式化后,它将变为0.03。显然,输出结果已经比输入结果低0.01 这是我的密码: float creditAvailableProportion = this.accountSummary != null ? (this.accountSummary.getCreditAvailable()/this.accountSummary.getCreditLimit()) : 0; DecimalFormat decimalFo

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

这是我的密码:

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);
提前感谢。

如何调试:

运行此代码,应该可以清楚地说明问题:

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);
希望这能教你一点钓鱼的技巧。

如何调试:

运行此代码,应该可以清楚地说明问题:

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);

希望这能教你钓鱼。

另外,你可以试试Math.floor()。把它变成一根绳子什么的都没有用

float temp = 7.888888f;
temp = temp * 100;
        temp = (float) Math.floor((double)temp);
        temp = temp /100;
        System.out.println(temp);

此外,您还可以尝试Math.floor()。把它变成一根绳子什么的都没有用

float temp = 7.888888f;
temp = temp * 100;
        temp = (float) Math.floor((double)temp);
        temp = temp /100;
        System.out.println(temp);

由于没有人解释这个问题,让我简单地解释一下发生了什么。大多数系统(包括java)中的浮点数都不精确。这意味着.04在内部存储为例如.039999999或.04000001或类似的内容。因此,当您使用楼层格式对其进行格式化时,可能会以.03结尾。 解决方案是使用舍入格式,或在格式之前将.0000001添加到值。这样,即使是在地板上也会正确。

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

由于没有人解释这个问题,让我简单解释一下发生了什么。大多数系统(包括java)中的浮点数都不精确。这意味着.04在内部存储为例如.039999999或.04000001或类似的内容。因此,当您使用楼层格式对其进行格式化时,可能会以.03结尾。 解决方案是使用舍入格式,或在格式之前将.0000001添加到值。这样,即使是在地板上也会正确。

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

System.out.println(decimalFormat.format(0.04))打印
0.04
;您正在使用小于
0.04
(将被降到
0.03
)的值调用它。@Long您能告诉我们
this.accountSummary.getCreditAvailable()
this.accountSummary.getCreditLimit()
的值是多少吗?请不要格式化它。把它四舍五入到2位小数。你应该没事。做一个System.out.println(creditAvailableProportion)。你应该发现在格式化之前它小于.04。但是我需要它是那种格式。有没有办法得到正确的值?我试过地板和天花板,但都不正确。
System.out.println(decimalFormat.format(0.04))打印
0.04
;您正在使用小于
0.04
(将被降到
0.03
)的值调用它。@Long您能告诉我们
this.accountSummary.getCreditAvailable()
this.accountSummary.getCreditLimit()
的值是多少吗?请不要格式化它。把它四舍五入到2位小数。你应该没事。做一个System.out.println(creditAvailableProportion)。你应该发现在格式化之前它小于.04。但是我需要它是那种格式。有没有办法得到正确的值?我尝试了地板和天花板,但没有一个是正确的。我想这是因为这一个,但不确定为什么:decimalFormat.setRoundingMode(RoundingMode.Floor);那么,哪个值是第一个没有正确数字的值?使用我的代码,您应该可以打印出三个值。它们是什么?请包括所有三个打印输出的输出。我认为这是因为这一个,但不确定为什么:decimalFormat.setRoundingMode(RoundingMode.FLOOR);那么,哪个值是第一个没有正确数字的值?使用我的代码,您应该可以打印出三个值。它们是什么?请包括所有三个打印输出的输出。