我有以下代码:
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
这是什么原因?
答案 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");
打印相同的结果