あなたはお金の量を表すために、単精度と倍精度値を使用することはできません

あなたはお金の量を表すために、単精度と倍精度値を使用することはできません

面接については、データの種類の使用量は?

ないdoubeのではなく、フロートが、BigDecimalを持ちます。誤差量の金融項目については容認することはできません。だから、データの種類を正確に量を表すために?JDKのjava.math.BigDecimalは、このクラスのクラスは、任意の精度の数値を表すことができる提供します。

Javaは、float精度有効桁数で6-7です。倍精度のビット15-16、BigDecimalを超える、16ビットの有効数正確な計算に

多く:Baiduの百科事典| BigDecimalを

単精度と倍精度について

フロート:2 ^ 23 = 8388608、7桁の有効数字まで手段7仮数の合計が、6の絶対的な保証、すなわちフロート精度有効桁6-7。

ダブル:同様^ 52 = 4503599627370496 2、16の合計16ビット〜15ビットの倍精度。

ちなみに、別の問題を見て:
フロートはまだ4バイトの32ビットではないでしょうか?なぜ^ 2 ^ 128の最大値は-1(3.40E + 38) ですか?

これは、前記符号ビットは、8つの指数部、仮数部23、コンピュータ内のフロートを格納するために、科学的表記法に基づいて、記憶装置に関連しています。

問題の量を計算し、正確でありません、精度が失われます。

見て:

public class Test {

    public static void main(String[] args) {

        double d1 = 11000;
        double d2 = 0.35;
        // 错误的:3849.9999999999995
        System.out.println("错误的:" + d1 * d2);

        BigDecimal bigDecimal1 = new BigDecimal(11000);
        BigDecimal bigDecimal2 = BigDecimal.valueOf(0.35);
        // multiply 乘法;正确的:3850.00
        System.out.println("正确的:" + bigDecimal1.multiply(bigDecimal2));
        
    }
}

ときに問題第二に、データ型の変換に問題があります

public class Test {

    public static void main(String[] args) {
        long longMaxVal = Long.MAX_VALUE;
        double doubleVal = longMaxVal / 1.0;
        double clone = doubleVal;

        // 参考 Alibaba 《码出高效》, 两浮点数之差小于 diff 任务相等比较改进
        float diff = 1e-6f;

        System.out.println(doubleVal);
        clone += 1000;
        System.out.println(clone);

        if (Math.abs(clone - doubleVal) < diff) {
            // do
            System.out.println("两数相等");
        } else {
            System.out.println("两数不相等");
        }
    }
}

おすすめ

転載: www.cnblogs.com/xpwi/p/11367890.html