Java中Binet公式计算斐波那契数列F47出现负数问题
问题分析与解决方案
你的判断没错,问题核心是整数溢出加上double精度不足:
- int类型的最大值是
2^31-1=2147483647,而F47的实际值2971215073已经超出这个范围,强制转换为int时会触发二进制溢出,结果变成负数。 - 硬编码的黄金分割率
1.61803398875精度不够,会随着n的增大放大计算误差,进一步影响结果准确性。
解决办法
- 替换数据类型:把返回值类型从
int改为long,long的最大值是9223372036854775807,足够容纳前90项左右的斐波那契数。 - 精确计算黄金分割率:用公式
(1 + Math.sqrt(5)) / 2计算fi,避免硬编码带来的精度损失。 - 调整结果接收类型:用long接收计算结果,彻底避免溢出问题。
修改后的代码
import java.lang.Math; class Fibonacci { public static long NthFibonacci(int n) { // 精确计算黄金分割率,避免硬编码精度不足 double fi = (1 + Math.sqrt(5)) / 2; // 用long存储结果,防止溢出 long fb = (long) Math.round((Math.pow(fi, n) - Math.pow(1 - fi, n)) / Math.sqrt(5)); return fb; } public static void FibonacciSeries(int n) { for (int i = 0; i < n; i++) { System.out.print(NthFibonacci(i) + " "); } } public static void main(String[] args) { FibonacciSeries(50); } }
补充说明
修改后运行代码,F47会正确输出2971215073。如果需要计算超过90项的斐波那契数,double的精度会达到瓶颈,此时建议改用迭代法或带记忆化的递归法,避免浮点数精度问题。
内容的提问来源于stack exchange,提问作者Vled
相关产品推荐
相关产品推荐

