This question already has answers here:
Is floating point math broken?
                                
                                    (31个答案)
                                
                        
                                4年前关闭。
            
                    
在以下示例中,任何人都可以解释double和float数据类型的行为。为什么精度值在变化?

public class TestClass{
public static void main(String[] args) {

String st = "4.45";
double i = Double.parseDouble(st);
float fff = Float.parseFloat(st);

System.out.println("Float 4.45 outputs : *******************************");
System.out.println(fff);
int fpp = (int) (fff *100);
System.out.println(fff *100);
System.out.println(fpp);

System.out.println("Double 4.45 outputs : *******************************");
System.out.println(i);
int p = (int) (i *100);
System.out.println(i *100);
System.out.println(p);

String str = "9.45";
double ii = Double.parseDouble(str);
float ff = Float.parseFloat(str);

System.out.println("Float 9.45 outputs : *******************************");
System.out.println(ff);
int fp = (int) (ff *100);
System.out.println(ff *100);
System.out.println(fp);

System.out.println("Double 9.45 outputs : *******************************");
System.out.println(ii);
int pp = (int) (ii *100);
System.out.println(ii *100);
System.out.println(pp);


String strr = "9.40";
double iir = Double.parseDouble(strr);
float ffr = Float.parseFloat(strr);

System.out.println("Float 9.40 outputs : *******************************");
System.out.println(ffr);
int fpr = (int) (ffr *100);
System.out.println(ffr *100);
System.out.println(fpr);

System.out.println("Double 9.40 outputs : *******************************");
System.out.println(iir);
int ppr = (int) (iir *100);
System.out.println(iir *100);
System.out.println(ppr);
}
}


输出:

浮动4.45输出:***********************************

4.45

444.99997

444

双4.45输出:*******************************

4.45

445.0

445

浮动9.45输出:*******************************

9.45

945.0

945

双9.45输出:*******************************

9.45

944.9999999999999

944

浮动9.40输出:*******************************

9.4

939.99994

939

双重9.40输出:*******************************

9.4

940.0

940

最佳答案

FloatDouble和它们的原始副本上执行操作容易导致精度损失小数位数(例如,您打印的ii * 100值)。

这就是为什么通常使用java.math包中的类进行与货币相关的计算(例如BigDecimal)的原因。

08-16 08:06