打印出数据类型

时间:2017-03-22 11:33:04

标签: java types

我有以下代码:

class Solution{
public static void main(String []argh){
        Scanner sc = new Scanner(System.in);   
        try
        {
            long x=sc.nextLong();
            System.out.println(x+" can be fitted in:");
            if(x>=-128 && x<=127)System.out.println("* byte");
            if(x>=-32768 && x<=32767)System.out.println("* short");
            // The following two lines will be replaced:
            if(x>=Math.pow(-2,31) && x<=Math.pow(2,31)-1)System.out.println("* int");
            if(x>=Math.pow(-2,63) && x<=Math.pow(2,63)-1)System.out.println("* long");
        }
        catch(Exception e)
        {
            System.out.println(sc.next()+" can't be fitted anywhere.");
        }

    }
}

输入: 9223372036854775807

输出: 9223372036854775807可以安装在: *长

如果我修改两条标记的行:

if(x>=(int)Math.pow(-2,31) && x<=(int)Math.pow(2,31)-1)System.out.println("* int");
if(x>=(long)Math.pow(-2,63) && x<=(long)Math.pow(2,63)-1)System.out.println("* long");

所以整个代码看起来像这样:

class Solution{
public static void main(String []argh){
    Scanner sc = new Scanner(System.in);

        try
        {
            long x=sc.nextLong();
            System.out.println(x+" can be fitted in:");
            if(x>=-128 && x<=127)System.out.println("* byte");
            if(x>=-32768 && x<=32767)System.out.println("* short");
            //The following two line have been replaced. 
            if(x>=(int)Math.pow(-2,31) && x<=(int)Math.pow(2,31)-1)System.out.println("* int");
            if(x>=(long)Math.pow(-2,63) && x<=(long)Math.pow(2,63)-1)System.out.println("* long");
            //
        }
        catch(Exception e)
        {
            System.out.println(sc.next()+" can't be fitted anywhere.");
        }

    }
}

如果输入相同,则输出将不同。

输入: 9223372036854775807

输出: 9223372036854775807可以安装在:

它没有打印出来:* long

这是什么原因?

4 个答案:

答案 0 :(得分:2)

这是由于两件事的结合而发生的:

  • 在java中具有比减法更高优先级的强制转换。

  • 当您尝试将long double转换为long的值太大而无法容纳(long)Math.pow(2,63)-1时,java会产生Long.MAX_VALUE。

所以,这个表达式:long计算两个到第63个幂,给出一个在long中无法表示的数字。然后它将其转换为 System.out.printf("%15f\n", Math.pow(2, 63)); System.out.printf("%15d\n", (long) Math.pow(2, 63)); System.out.printf("%15d\n", (long) Math.pow(2, 63) - 1); System.out.printf("%15d\n", (long) (Math.pow(2, 63) - 1)); ,为您提供Long.MAX_VALUE。但是它会从中减去一个,给你一个小于你想要的值。

以下内容:

9223372036854776000.000000 <-- inaccurate due to `double` being lossy
9223372036854775807 <-- Long.MAX_VALUE (what you really want)
9223372036854775806 <-- you subtracted one, so this is what you get
9223372036854775807 <-- what you also really want.

产生这个:

double

鉴于Long {MAX_VALUE似乎无法在Long.MAX_VALUE中准确表示,我建议您不要尝试使用double算术来推导range。< / p>

答案 1 :(得分:0)

使用下面的代码。

     Scanner sc = new Scanner(System.in);

    try
    {
        int x=sc.nextInt();
        System.out.println(x+" can be fitted in:");
        if(x>=-128 && x<=127)System.out.println("* byte");
        else if(x>=-32768 && x<=32767)System.out.println("* short");
        //The following two line have been replaced. 
        else if(x>=(int)Math.pow(-2,31) && x<=(int)Math.pow(2,31)-1)System.out.println("* int");
        else if(x>=(long)Math.pow(-2,63) && x<=(long)Math.pow(2,63)-1)System.out.println("* long");
        //
    }
    catch(Exception e)
    {
        System.out.println(sc.next()+" can't be fitted anywhere.");
    }

答案 2 :(得分:0)

如果我没有错,一个数字说332323232是整数类型,23L(而不是小)是长数据类型,因为它后面的L。 是的,你在第二种情况下输入9223372036854775807 [(2 ^ 63)-1]并且如果你输入1L或L然后它只是打印不能在任何地方安装,它说不打印*长的事实。 那是第二个错误。

答案 3 :(得分:0)

将其更改为

if ((x >= (long)Math.pow(-2, 63)) && (x <= (long)(Math.pow(2, 63) - 1)))
    System.out.println("* long");

这会产生输出:

9223372036854775807 can be fitted in:
* long

更可读的方式是写

if (x >= Long.MIN_VALUE && x <= Long.MAX_VALUE) 
    System.out.println("* long");

打印相同的结果