(1)値の範囲
floatとdoubleの範囲は、指数の桁数によって決まります。
floatの指数ビットは8ビットで、doubleの指数ビットは11ビットであり、次のように分散されます。
浮く:
1ビット(符号ビット) |
8ビット(指数ビット) |
23ビット(仮数ビット) |
ダブル:
1ビット(符号ビット) |
11ビット(指数ビット) |
52ビット(仮数ビット) |
したがって、floatの指数範囲は-127〜 + 128であり、doubleの指数範囲は-1023〜 + 1024であり、指数ビットは補数の形式で分割されます。負の指数は、浮動小数点数で何ができるかを決定します
最小の絶対値が表現されたゼロ以外の数値。正の指数は、浮動小数点数が表現できる最大の絶対値を持つ数値を決定します。これにより、浮動小数点数の値の範囲も決定されます。フロートの範囲は-2 ^ 128〜 + 2 ^ 128、
つまり、-3.40E + 38〜 + 3.40E + 38、doubleの範囲は-2 ^ 1024〜 + 2 ^ 1024、つまり-1.79E + 308〜 + 1.79E +308です。
(2)精度
floatとdoubleの精度は、小数部だけでなく、全体の桁数に基づいています。
floatの精度は有効数字7〜8桁で、7桁が保証され、8桁の値も存在します。
倍精度は16〜17有効数字です
コードの一部を見てください
public class Main {
public static void main(String[] args) {
float f6 = 1.000003f;//6位小数位,总共7位
float f7 = 1.0000003f;//7位小数位,总共8位
float f8 = 1.00000003f;//8位小数位,总共9位
float f_8 = 10.000003f;//6位小数位,总共8位
float f_9 = 10.0000003f;//7位小数位,总共9位
float f_10 = 10.00000003f;//8位小数位,总共10位
double d15 = 1.000000000000003;//15位小数位,总共16位
double d16 = 1.0000000000000003;//16位小数位,总共17位
double d17 = 1.00000000000000003;//17位小数位,总共18位
double d_17 = 10.000000000000003;//15位小数位,总共17位
double d_18 = 10.0000000000000003;//16位小数位,总共18位
double d_19 = 10.00000000000000003;//17位小数位,总共19位
System.out.println("结果为false证明 == 校验到了小数点位, 精确度可信");
System.out.println("float(7位有效,6位小数) 1.000003f == 1 的结果是:" + (f6==1));
System.out.println("float(8位有效,7位小数) 1.0000003f == 1 的结果是:" + (f7==1));
System.out.println("float(9位有效,8位小数) 1.00000003f == 1 的结果是:" + (f8==1));
System.out.println("float(8位有效,6位小数) 10.000003f == 10 的结果是:" + (f_8==10));
System.out.println("float(9位有效,7位小数) 10.0000003f == 10 的结果是:" + (f_9==10));
System.out.println("float(10位有效,8位小数) 10.00000003f == 10 的结果是:" + (f_10==10));
System.out.println("------------------");
System.out.println("double(16位有效,15位小数) 1.000000000000003 == 1 的结果是:" + (d15==1));
System.out.println("double(17位有效,16位小数) 1.0000000000000003 == 1 的结果是:" + (d16==1));
System.out.println("double(18位有效,17位小数) 1.00000000000000003 == 1 的结果是:" + (d17==1));
System.out.println("double(17位有效,15位小数) 10.000000000000003 == 10 的结果是:" + (d_17==10));
System.out.println("double(18位有效,16位小数) 10.0000000000000003 == 10 的结果是:" + (d_18==10));
System.out.println("double(19位有效,17位小数) 10.00000000000000003 == 10的结果是:" + (d_19==10));
}
}
結果がfalseの場合、小数点は意味があります。つまり、正確な場所です。
結果から、floatは有効数字8桁、倍精度17桁まで正確である可能性があります。
f1 == f2を使用して2つの数値が等しいと判断できない理由は、f1とf2は2つの異なる数値である可能性がありますが、浮動小数点の精度の制限により、2つの数値が等しいと誤って判断される可能性があるためです。ポイント数!