java双精度

yod*_*uhe 2 java floating-point

可能重复:
浮点精度

        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
Run Code Online (Sandbox Code Playgroud)

我在代码的大部分时间里使用了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);
Run Code Online (Sandbox Code Playgroud)

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

ᆼᆺᆼ*_*ᆼᆺᆼ 7

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


Ale*_*exR 6

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

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