我有一个将float转换为字符串的代码
total = quant * valUnit;
lb_total.setText(String.format(Locale.US,"%.2f", total));
if total = 56.025(7.5 * 7.47) > 56.02
if total = 71.025(7.5 * 9.47) > 71.03
为什么第一个没有完成?
我找到了解决问题的方法,我创建了一个正确的类。
import java.lang.Math;
// iniF = value to be rounded
// posIni = number of max houses(EX: 7.45 * 7.999, max houses for this operation is five)
// posFin = number of houses after rounded
// EX: xx*.xxxxx -> xx*.xx posIni = 5, posFin = 2
public class MyMath {
public Float MyRound(Float iniF, int posIni, int posFin){
Float result = 0.00f;
int resultTmp = 0;
int nCasas = (int) Math.pow(10, posIni - 1);
Float arredondaF = iniF * nCasas;
for(int p = posIni; p > posFin; p--){
resultTmp = Math.round(arredondaF);
arredondaF = (float) resultTmp / 10;
}
result = arredondaF / 10;
return result;
}
}
答案 0 :(得分:1)
由于内部精度差异,特别是因为这些数字是浮点运算的结果。在内部,56.025
实际上类似56.0249999998
,71.025
类似于71.025000000002
。由于二进制/十进制转换和值的位分辨率,浮点运算在计算机中并不精确,数学上精确。
以下是来自Ruby的示例:
irb(main):003:0> format("%.2f", 7.5 * 7.47)
=> "56.02"
irb(main):004:0> format("%.2f", 7.5 * 9.47)
=> "71.03"
在这里,我使用了更高的格式精度,你可以看到值的真正含义:
irb(main):007:0> format("%.15f", 7.5 * 9.47)
=> "71.025000000000006"
irb(main):008:0> format("%.15f", 7.5 * 7.47)
=> "56.024999999999999"
stackoverflow.com上有很多关于此问题的帖子,有各种形式。只需进行表格搜索"浮点精度"或者"浮点精确"。