常常无法精确表示的浮点数
浮点数有时可以精确表示,但是也常常无法精确表示,如下案例。
public static void main(String[] args) {
double x = 0.1;
double y = 0.2;
double z = 0.5;
System.out.println( x + y); //输出:0.30000000000000004
System.out.println( x + z); //输出:0.6
}
由于浮点数存在运算误差,所以比较两个浮点数是否相等常常会出现错误的结果。正确的比较方法是判断两个浮点数之差的绝对值是否小于一个很小的数。
// 比较x和y是否相等,先计算其差的绝对值:
double r = Math.abs(x - y);
// 再判断绝对值是否足够小:
if (r < 0.00001) {
// 可以认为相等
} else {
// 不相等
}
通过改写,下面程序的运算结果是 “结果与0.3相等”。
public static void main(String[] args) {
double x = 0.3;
double y = 0.9-0.6;
double r = Math.abs(x - y);
if (r < 0.00001) {
System.out.println( "结果与0.3相等");
} else {
System.out.println( "结果与0.3不相等");
}
}
浮点数包括单精度float和双精度double。使用float类型时必须在末尾加上f,比如
float x = 1.0f
;而使用double类型则不需要在末尾添加后缀,如double y = 1.0
。我们一般使用double双精度的关键字。
他の者にできたか?ここまでやれたか?この先できるか?いいや、仆にしかできない!