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 []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位。
从这个事实得出的唯一结论是绝不会尝试使用==
来比较浮点值 - 结果可能会令人困惑。
http://floating-point-gui.de/ – BalusC 2012-01-06 16:36:03
这是浮点类型的预期行为:http://*.com/questions/872544/precision-of-floatingpoint – Piskvor 2012-01-06 16:36:13