java双精度

可能重复:
浮点精度

double a=0.000001,b=50000; b=a*b; System.out.println("double:"+b); // -> double:0.049999999999999996 float a=0.000001f,b=50000; b=a*b; System.out.println("float"+b); // -> float0.05 

我在代码的大部分时间里使用了double,今天我发现了这个问题。 我该怎么处理?

语境:

  double []refValues= {100,75,50,25,15,5,1}; double bInMilliGram=b*1000; double pickedVal=0; for(double ref:refValues) if(ref<=bInMilliGram) { pickedVal=ref; break; } System.out.println("bInMilliGram:"+bInMilliGram+", pickedVal:"+pickedVal); 

o / p: – > bInMilliGram:49.99999999999999,pickedVal:25.0

如果您需要任意精度,请使用java.math.BigDecimal类。

这不成问题。 这是双重的工作方式。 您无需处理它并关心它。 双精度就足够了。 请注意,您的数字与预期结果之间的差异在小数点后的19位。

从这个事实得出的唯一结论是永远不要尝试使用==来比较浮点值 – 结果可能会令人困惑。