首页 > 解决方案 > java Float.MAX_VALUE 到 Double

问题描述

就是这个代码:

public class Main {
    public static void main(String[] args) {
      float a = Float.MAX_VALUE;
      double b = (double) a;
      b++;
      System.out.println(b == a);
}

它打印出来true。谁能解释为什么?

标签: javafloating-pointdouble

解决方案


的精度double无法表示 和 之间的差异Float.MAX_VALUEFloat.MAX_VALUE+1因此返回四舍五入的结果。四舍五入的结果是Float.MAX_VALUE.

Float.MAX_VALUE是 2 128 -2 104。(注意,这是 2 127 +2 126 +2 125 +…+2 104 。也就是说,它是从 2 127到 2 104的 2 的所有幂的和。在二进制中,它有 24 个一位,即a 的有效位1中的位数float。数学上,它等于 2 128 -2 104。)

当您将其加一时,数学结果当然是 2 128 -2 104 +1。这在 中无法表示double,因为 a 的有效double位是 53 位,但从 2 127到 1 是 129 位。您不能将 2 127和 1 的位都放在 a 的有效数字内double。当结果不可表示时,返回最接近的可表示数字。

数学结果正下方的可表示数字是 2 128 -2 104,数学结果正上方的可表示数字是 2 128 -2 104 +2 75。(请注意,从 2 127到 2 75是 52 位,因此 2 75是 53 位有效位中 2 的最小幂,其中最大位被缩放为 2 127。因此,我们计算了高于 2 的下一个数字128 -2 104通过添加适合有效数字的最小数量。)所以我们有两个候选者:

  • 2 128 -2 104,与 2 128 -2 104 +1 相差 1。
  • 2 128 -2 104 +2 75,即 2 104 +2 75 -1 与 2 128 -2 104 +1 的距离。

前者更接近,所以选择它作为计算结果。因此,在 中double,将 1 加到 2 128 -2 104会产生 2 128 -2 104

脚注

1二进制浮点数的表示由三部分组成:符号s为 +1 或 -1,有效数f是具有固定位数的定点数,以及指数e,使得表示的数字是sf • 2 e。有效位可以被认为是具有一定位数的整数,但它通常通过调整指数来缩放,以便正常浮点数的有效位在 [1, 2) 中。例如,132 可以被认为是有效数字 100001 2乘以 2 2或 1.00001 2乘以 2 7


推荐阅读