Java转换为Double

Java转换为Double,java,java-8,java-7,Java,Java 8,Java 7,在上述代码中,当f未附加到1.13时,输出为112.99999999999,但当f附加到1.13时,输出值为us 113。为什么会出现这种情况?当您将f添加到小数点后,它将成为一个float常量,只有大约6位精度。这使得表示错误的可能性更大 当你不再使用f时,小数点是一个双精度,其精度是0.5万亿倍。这使得表示错误小得多,当打印为double时,您不太可能看到它 打印双精度时,库预计会出现一些表示错误,并将显示与双精度相同表示形式的最简单/最短数字。(这实际上是映射到同一表示形式的无穷多个数字)

在上述代码中,当f未附加到1.13时,输出为112.99999999999,但当f附加到1.13时,输出值为us 113。为什么会出现这种情况?

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

当你不再使用
f
时,小数点是一个双精度,其精度是0.5万亿倍。这使得表示错误小得多,当打印为
double
时,您不太可能看到它

打印
双精度
时,库预计会出现一些表示错误,并将显示与双精度相同表示形式的最简单/最短数字。(这实际上是映射到同一表示形式的无穷多个数字)


但是,这种隐式四舍五入只能纠正非常小的数量,并且不太可能纠正
浮点的表示错误。注意:如果使用
float
而不是
double
进行打印,将执行更大的舍入操作,从而隐藏错误。

f
添加到小数点时,将使其成为
float
常量,其精度只有约6位。这使得表示错误的可能性更大

当你不再使用
f
时,小数点是一个双精度,其精度是0.5万亿倍。这使得表示错误小得多,当打印为
double
时,您不太可能看到它

打印
双精度
时,库预计会出现一些表示错误,并将显示与双精度相同表示形式的最简单/最短数字。(这实际上是映射到同一表示形式的无穷多个数字)


但是,这种隐式四舍五入只能纠正非常小的数量,并且不太可能纠正
浮点的表示错误。注意:如果使用
float
而不是
double
进行打印,将执行更大的舍入操作,从而隐藏错误。

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

一般来说,浮点数的问题是某些数字无法精确表示。内部表示法尾数的每一位代表分母中具有2次幂的分数,因此1/2、1/4、1/8、1/16等。然后计算机将选择表示所需数字的最近数字

在您的情况下,当您省略
f
时,它将使用完整的双精度位,并获取最接近它的数字(112.9999999)。当您执行
f
时,您告诉程序将其向上舍入到最接近的单精度浮点,因此不适合的前9个将被舍入并传播到值113


对于这个具体数字来说,这有点巧合。不要假设使用单精度浮点总会得到预期的结果。浮点运算在计算中总是有点混乱。

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

一般来说,浮点数的问题是某些数字无法精确表示。内部表示法尾数的每一位代表分母中具有2次幂的分数,因此1/2、1/4、1/8、1/16等。然后计算机将选择表示所需数字的最近数字

在您的情况下,当您省略
f
时,它将使用完整的双精度位,并获取最接近它的数字(112.9999999)。当您执行
f
时,您告诉程序将其向上舍入到最接近的单精度浮点,因此不适合的前9个将被舍入并传播到值113


对于这个具体数字来说,这有点巧合。不要假设使用单精度浮点总会得到预期的结果。浮点运算在计算中总是有点混乱。

你用
BigDecimal
而不是
double
尝试过同样的测试吗?我得到了相同的输出112。99999999999999@Nikhil ... 因为双精度(64位)的
d
是默认值,因此与省略它相同。这就是为什么尝试
d
是无用的。您是否尝试过使用
BigDecimal
而不是
double
进行相同的测试?我得到了相同的输出112。99999999999999@Nikhil ... 因为双精度(64位)的
d
是默认值,因此与省略它相同。这就是为什么尝试
d
是无用的。根据你的说法,这是“不太可能的”,但OP正好是这样。@ThomasWeller也许这句话让人困惑。我已经重写了它。这只发生在1.13到1.16之间的值,其余的我都得到了正确的输出,比如说1.17是值乘以100,所以我现在得到了117,这是正确的。根据你的说法,这是“不太可能的”,但OP正好是这种情况。@ThomasWeller也许这个说法令人困惑。我已经重写了它。这只发生在1.13到1.16之间的值,其余的我都得到了正确的输出,比如说1.17是值乘以100,所以我得到了117,这是正确的
   class Rextester
{  
    public static void main(String args[])
    {
        double b = 1.13f * 100;
        System.out.println(b);
    }
}