浮点数运算

浮点数运算

1. 浮点数四则运算

Java 的浮点数(floatdouble)可以进行加、减、乘、除运算,但 不能进行位运算或移位运算

浮点数无法保证精确表示。
例如,0.1 在二进制中是无限循环小数,因此浮点数中只能保存一个近似值;但 0.5 可以被精确表示。

示例:

1
2
3
4
5
6
7
8
9
10
// 浮点数运算误差
public class Main {
public static void main(String[] args) {
double x = 1.0 / 10;
double y = 1 - 9.0 / 10;
// 观察x和y是否相等:
System.out.println(x);
System.out.println(y);
}
}

由于浮点数存在运算误差,所以比较两个浮点数是否相等常常会出现错误的结果。正确的比较方法是判断两个浮点数之差的绝对值是否小于一个很小的数:

1
2
3
4
5
6
7
8
// 比较x和y是否相等,先计算其差的绝对值:
double r = Math.abs(x - y);
// 再判断绝对值是否足够小:
if (r < 0.00001) {
// 可以认为相等
} else {
// 不相等
}

2. 类型提升(Type Promotion)

当浮点数与整数共同参与运算时,整数会自动提升为浮点数:

1
2
3
4
5
6
7
8
// 类型提升
public class Main {
public static void main(String[] args) {
int n = 5;
double d = 1.2 + 24.0 / n; // 6.0
System.out.println(d);
}
}

需要特别注意,在一个复杂的四则运算中,两个整数的运算不会出现自动提升的情况。例如:

1
double d = 1.2 + 24 / 5; // 结果不是 6.0 而是 5.2

计算结果为5.2,原因是编译器计算24 / 5这个子表达式时,按两个整数进行运算,结果仍为整数4

要修复这个计算结果,可以将24 / 5改为24.0 / 5。由于24.0是浮点数,因此,计算除法时自动将5提升为浮点数:

1
double d = 1.2 + 24.0 / 5; // 6.0

3. 浮点数的特殊值(溢出表现)

整数运算在除数为0时会报错,而浮点数运算在除数为0时,不会报错,但会返回几个特殊值:

  • NaN表示Not a Number
  • Infinity表示无穷大
  • -Infinity表示负无穷大
表示 含义
NaN Not a Number
Infinity 正无穷大
-Infinity 负无穷大

示例:

1
2
3
double d1 = 0.0 / 0;  // NaN
double d2 = 1.0 / 0; // Infinity
double d3 = -1.0 / 0; // -Infinity

这三种特殊值在实际运算中很少碰到,只需要了解即可。


4. 强制转型(Cast)

浮点数 → 整数时会直接舍弃小数部分:

1
2
3
int n1 = (int) 12.3;   // 12
int n2 = (int) 12.7; // 12
int n3 = (int) -12.7; // -12

超过整数范围时返回最大(或最小)整数:

1
int n = (int) 1.2e20; // 2147483647

四舍五入:浮点数 + 0.5 后取整

1
2
double d = 2.6;
int n = (int) (d + 0.5); // 3

5. 练习:求一元二次方程的根

公式:
$$
x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
$$
示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 一元二次方程
public class Main {
public static void main(String[] args) {
double a = 1.0;
double b = 3.0;
double c = -4.0;
// 求平方根可用 Math.sqrt():
// System.out.println(Math.sqrt(2)); ==> 1.414
// TODO:
double r1 = 0;
double r2 = 0;
System.out.println(r1);
System.out.println(r2);
System.out.println(r1 == 1 && r2 == -4 ? "测试通过" : "测试失败");
}
}

6. 小结

  • 浮点数 不能精确表示多数小数(如 0.1),会产生误差。
  • 浮点数比较需判断差值是否小于某个阈值。
  • 整数和浮点数一起运算时,整数会自动提升为浮点数。
  • 整数之间的表达式运算不会自动变为浮点运算,可能导致计算结果错误。
  • 强制转型会直接截断小数部分。
  • 浮点数除以 0 不会报错,而是产生 NaN, Infinity, -Infinity

浮点数运算
https://cryocore1225.github.io/java/j1/f4bcb891.html
作者
Cryocore1225
更新于
2025年12月7日
许可协议