Java DecimalFormat返回错误的结果
有人知道我做错了什么吗?我有一个浮点数,假设是0.04。格式化后,它将变为0.03。显然,输出结果已经比输入结果低0.01 这是我的密码: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
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);那么,哪个值是第一个没有正确数字的值?使用我的代码,您应该可以打印出三个值。它们是什么?请包括所有三个打印输出的输出。