2.6 浮点数
一种更通用的解决方案是使用浮点(floating-point)数,它可用于表示小数,也可用于表示整数。在 Java 中,默认的浮点类型为 double,它指的是双精度浮点数。double 变量的声明和赋值语法与其他类型的变量相同:
double pi;pi = 3.14159;
只要有一个操作数为 double 值,Java 就执行“浮点除法”,因此,我们可以用如下方式来解决 2.5 节中的问题:
double minute = 59.0;System.out.print("Fraction of the hour that has passed: ");System.out.println(minute / 60.0);
输出如下:
Fraction of the hour that has passed: 0.9833333333333333
虽然浮点数很有用,但也可能让人感到迷惑。例如,Java 区分整数 1 和浮点数 1.0,即使它们看起来是同一个数字。它们属于不同的数据类型,而严格来说,你不能将一种类型的值赋给另一种类型的变量。
下面的语句是非法的,因为左边是一个 int 变量,而右边是一个 double 值:
int x = 1.1; // 编译错误
这种规则很容易忘记,因为 Java 在很多情况下会自动转换类型:
double y = 1; // 合法,但这是一种糟糕的做法
这个示例原本应该是非法的,但由于 Java 自动将 int 值 1 转换为 double 值 1.0,使得这个示例变得合法了。这样的宽容是十分便利的,但常会给初学者带来问题,例如:
double y = 1 / 3; // 常见的错误
你可能会认为变量 y 的值为 0.333333——一个合法的浮点值,但实际上其值为 0。右边的表达式将两个整数相除,因此 Java 执行整数除法,结果为 int 值 0。这个结果被转换为 double 值 0.0,再赋给变量 y。
对于这种问题,其中一种解决方案是将右边的表达式变成浮点表达式,如下所示,这样变量 y 将像预期的那样被设置为 0.333333:
double y = 1.0 / 3.0; // 正确
作为一种编程风格,在任何情况下都应将浮点值赋给浮点变量。编译器并没有要求必须这样做,但如果不这样做的话,不知什么时候一个简单的错误就可能阴魂不散,给你带来麻烦。
