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 结果。浮点运算在计算上总是有点乱。
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 结果。浮点运算在计算上总是有点乱。