从double转换为long,完全转换我的号码

时间:2014-01-16 00:04:06

标签: java casting double long-integer fibonacci

我正在编写一个程序来计算Fibonacci序列的第n个位置。该程序的最小目标是能够打印100,理想的最终目标是计算超出该点。出于这个原因,我必须使用原始类型long来处理数字的大小。

    public static long fibonacci (long n)
    {
    double phi = ((1 + Math.sqrt(5))/2);
    double result;
    result = ((Math.pow(phi, n))/Math.sqrt(5));

    return (long) result;
    }

这需要一个名为Phi的数字,以我想要找到的位置的力量。然后该值除以5的平方根。现在第100个斐波纳契数是354224848179262000000我可以成功获得这个数字,但是由于双倍数不能处理大数,它被压缩成科学记数法。 (或者至少我认为这就是科学记谱法的原因)

所以我的思维过程是,通过将它转换为一个可以管理更大数字的变量类型,它将整体打印出来,“354224848179262000000”,而不是“3.542248481792631E20”。所以我成功地投入了很长时间并返回结果,这就是问题所在。(抱歉有这么多背景信息要通过)

当我转换小数时,这是正确答案,它将数字转换为完全不同的数字。我得到的数字是9223372036854775807.所以有人可以解释我做错了什么,或者我需要做什么才能得到,“3.542248481792631E20”打印出来,“354224848179262000000”谢谢大家!

这是我的全部代码,希望你们能发现一些东西或向我解释一些东西。也许我误解了多长时间的功能。

import java.util.Scanner;

public class FibLong
{

    public static void main(String[] args) 
    {
        long position;
        long answer;
        Scanner input = new Scanner (System.in);
        System.out.print ("Please enter an Nth position within the Fibonacci sequence: ");
        position = input.nextLong();
        answer = fibonacci(position);
        System.out.printf ("The Fibonacci number of position " + position + " is the number " + answer);
    }

    public static long fibonacci (long n)
    {
        double phi = ((1 + Math.sqrt(5))/2);
        double result;
        result = ((Math.pow(phi, n))/Math.sqrt(5));
        return (long) result;
    }

}

2 个答案:

答案 0 :(得分:3)

向下转换double值太大而无法放入long时,这是预期的行为。结果的值实际上是Long.MAX_VALUE

要保持精确度,请考虑将其转换为BigIntegerBigDecimal

JLS, Section 5.1.3,涵盖了“缩小基元转换”。

  

将浮点数转换为整数类型T需要两个步骤:

     
      
  1. 在第一步中,浮点数转换为long(如果T为long)或转换为int(如果T为byte,short,char或int),如下所示:

         
        
    • 如果浮点数为NaN(§4.2.3),则转换的第一步结果为int或long 0。

    •   
    • 否则,如果浮点数不是无穷大,则浮点值将四舍五入为整数值V,使用IEEE 754舍入为零的模式舍入为零(第4.2.3节) 。然后有两种情况:

    •   
  2.         

    一个。如果T很长,并且这个整数值可以表示为long,那么第一步的结果就是长值V.

         

    湾否则,如果此整数值可以表示为int,则第一步的结果是int值V.

         
        
    • 否则,以下两种情况之一必须为真:
    •   
         

    一个。该值必须太小(大幅度或负无穷大的负值),第一步的结果是int或long类型的最小可表示值。

         

    湾该值必须太大(大幅度或正无穷大的正值),第一步的结果是类型为int或long 的最大可表示值。

(我的重点)

答案 1 :(得分:0)

不要将double用于此大小的数字,因为double值太远。因此,即使您将double转换为BigDecimalBigInteger,您的答案也可能不正确。

您可以在this question中找到一些相关信息。遗憾的是,BigDecimal并没有内置平方根。如果我必须这样做,我会单独计算sqrt(5)所需的精度,以surd形式执行所需的算术,并替换最后在sqrt(5)