Java 转换为双精度

Java Conversion into Double

   class Rextester
{  
    public static void main(String args[])
    {
        double b = 1.13f * 100;
        System.out.println(b);
    }
}

在上面的代码中,当 f 未附加到 1.13 时,输出为 112.99999999999999,但当 f 附加到 1.13 时,值 us 113。为什么会这样?

当您将 f 添加到小数点后,它会成为一个 float 常数,其精度只有大约 6 位数字。这使得表示错误的可能性更大,更大。

当您放弃使用 f 时,小数点是精度为 5000 倍的双精度数。这使得表示错误小得多,并且当打印为 double 时,您不太可能看到它。

当您打印 double 时,库预计会有一些表示错误,并会向您显示 simplest/shortest 数字,它与双精度数具有相同的表示。 (这实际上是映射到相同表示的无限数量的数字)

但是,这种隐式舍入只会纠正非常小的部分,不太可能纠正 float 的表示错误。注意:如果您使用 float 而不是 double 进行打印,它将执行更大的舍入,隐藏错误。

f 后缀告诉 Java 该数字是单精度浮点数,而不是双精度浮点数。

一般来说,浮点数的问题是无法精确表示某些数字。内部表示的尾数的每一位代表分母的2次方的分数,所以1/2、1/4、1/8、1/16等。那么计算机会select最接近的代表你想要的数字的数字。

你的情况是,当你省略 f 时,它使用完整的双精度位,并得到最接近它的数字 (112.9999999999)。当您执行 f 时,您是在告诉程序将其四舍五入到最接近的单精度浮点数,因此不适合的前 9 个将四舍五入并传播到值 113.

这个具体数字有点巧合。不要假设使用单精度浮点数总是会给你 expected 结果。浮点运算在计算上总是有点乱。