Java转换为Double
在上述代码中,当f未附加到1.13时,输出为112.99999999999,但当f附加到1.13时,输出值为us 113。为什么会出现这种情况?当您将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
添加到小数点后,它将成为一个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);
}
}