あなたはお金の量を表すために、単精度と倍精度値を使用することはできません
面接については、データの種類の使用量は?
ないdoubeのではなく、フロートが、BigDecimalを持ちます。誤差量の金融項目については容認することはできません。だから、データの種類を正確に量を表すために?JDKのjava.math.BigDecimalは、このクラスのクラスは、任意の精度の数値を表すことができる提供します。
Javaは、float精度有効桁数で6-7です。倍精度のビット15-16、BigDecimalを超える、16ビットの有効数正確な計算に
単精度と倍精度について
フロート: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("两数不相等");
}
}
}