浮点数运算
浮点数运算
1. 浮点数四则运算
Java 的浮点数(float、double)可以进行加、减、乘、除运算,但 不能进行位运算或移位运算。
⚠ 浮点数无法保证精确表示。
例如,0.1 在二进制中是无限循环小数,因此浮点数中只能保存一个近似值;但 0.5 可以被精确表示。
示例:
1 | |
由于浮点数存在运算误差,所以比较两个浮点数是否相等常常会出现错误的结果。正确的比较方法是判断两个浮点数之差的绝对值是否小于一个很小的数:
1 | |
2. 类型提升(Type Promotion)
当浮点数与整数共同参与运算时,整数会自动提升为浮点数:
1 | |
⚠ 需要特别注意,在一个复杂的四则运算中,两个整数的运算不会出现自动提升的情况。例如:
1 | |
计算结果为5.2,原因是编译器计算24 / 5这个子表达式时,按两个整数进行运算,结果仍为整数4。
要修复这个计算结果,可以将24 / 5改为24.0 / 5。由于24.0是浮点数,因此,计算除法时自动将5提升为浮点数:
1 | |
3. 浮点数的特殊值(溢出表现)
整数运算在除数为0时会报错,而浮点数运算在除数为0时,不会报错,但会返回几个特殊值:
NaN表示Not a NumberInfinity表示无穷大-Infinity表示负无穷大
| 表示 | 含义 |
|---|---|
NaN |
Not a Number |
Infinity |
正无穷大 |
-Infinity |
负无穷大 |
示例:
1 | |
这三种特殊值在实际运算中很少碰到,只需要了解即可。
4. 强制转型(Cast)
浮点数 → 整数时会直接舍弃小数部分:
1 | |
超过整数范围时返回最大(或最小)整数:
1 | |
四舍五入:浮点数 + 0.5 后取整
1 | |
5. 练习:求一元二次方程的根
公式:
$$
x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
$$
示例代码:
1 | |
6. 小结
- 浮点数 不能精确表示多数小数(如 0.1),会产生误差。
- 浮点数比较需判断差值是否小于某个阈值。
- 整数和浮点数一起运算时,整数会自动提升为浮点数。
- 整数之间的表达式运算不会自动变为浮点运算,可能导致计算结果错误。
- 强制转型会直接截断小数部分。
- 浮点数除以 0 不会报错,而是产生
NaN,Infinity,-Infinity。
浮点数运算
https://cryocore1225.github.io/java/j1/f4bcb891.html