3董铭辉3

导航

十月八日

问题描述:
1.在计算50的阶乘时,程序显示的结果居然是一个负数,为什么?
根源分析:
这是典型的整型溢出(Integer Overflow)问题。
Java中的 int 类型是32位有符号整数,使用补码表示。取值范围是:
· 最大值:2^{31}-1 = 2,147,483,647
· 最小值:-2^{31} = -2,147,483,648
当计算阶乘时,结果数值呈指数级增长,迅速超过了 int 的最大值。当计算结果超出最大值时,会发生溢出,即数值进位到了符号位(最高位),导致结果变成负数。
2.如何解决大数计算问题?
解决方案:
Java 提供了 java.math.BigInteger 类,支持任意精度的整数运算。
代码实现(计算 50!):
import java.math.BigInteger;

public class BigNumberDemo {
public static void main(String[] args) {
// 计算 50!
BigInteger result = factorial(50);
System.out.println("50! = " + result);
}

public static BigInteger factorial(int n) {
BigInteger result = BigInteger.ONE; // 初始值为1
for (int i = 1; i <= n; i++) {
// 将 int 转换为 BigInteger 并进行乘法
result = result.multiply(BigInteger.valueOf(i));
}
return result;
}
}
3. 如果要比较两个浮点数
问题描述:
double i = 0.0001; double j = 0.00010000000000000001; 结果 i == j 结果是 false
原因分析:
计算机使用二进制浮点数(IEEE 754标准)存储小数,很多十进制小数无法精确表示,导致存在微小的舍入误差。直接用 == 比较两个浮点数是不安全的。
正确的比较方法:
比较两个浮点数的差值是否小于一个极小值(阈值,通常称为 epsilon)。
代码实现:
public class FloatCompareDemo {
public static void main(String[] args) {
double i = 0.0001;
double j = 0.00010000000000000001;

// 错误做法
System.out.println("直接比较: " + (i == j)); // false

// 正确做法:设定一个极小的误差范围
double epsilon = 1e-10; // 10的-10次方
if (Math.abs(i - j) < epsilon) {
System.out.println("两数相等(在误差允许范围内)");
} else {
System.out.println("两数不相等");
}
}
}

posted on 2026-10-08 09:44  3董铭辉3  阅读(8)  评论(0)    收藏  举报