java双精度

java双精度,java,floating-point,Java,Floating Point,可能重复: 我在大部分代码中使用了double,今天我发现了这个问题。 我该怎么处理 背景: double []refValues= {100,75,50,25,15,5,1}; double bInMilliGram=b*1000; double pickedVal=0; for(double ref:refValues) if(ref<=bInMilliGram) {

可能重复:

我在大部分代码中使用了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);
double[]refValues={100,75,50,25,15,5,1};
双毫克=b*1000;
双重选取值=0;
用于(双参考:参考值)

如果(参考Binmiligram:49.99999999999,pickedVal:25.0

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

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


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

这是浮点类型的预期行为:
        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);