gpt4 book ai didi

java - 打印出数据类型

转载 作者:行者123 更新时间:2023-12-02 02:56:52 24 4
gpt4 key购买 nike

我有以下代码:

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

这是什么原因?

最佳答案

发生这种情况是由于两件事的结合:

  • 在 Java 中强制转换的优先级高于减法。

  • 当您尝试将一个太大而无法放入 longdouble 值转换为 long 时,java 会产生 Long.MAX_VALUE >.

因此,这个表达式:(long)Math.pow(2,63)-1 计算 2 的 63 次方,给出一个无法用 long 表示的数字>。然后它将其转换为 long,为您提供 Long.MAX_VALUE。但随后它会从中减去一,得到的值小于您想要的值。

以下内容:

    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));

产生这个:

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.

鉴于 Long.MAX_VALUE 似乎无法在 double 中准确表示,我建议您不要尝试使用派生 Long.MAX_VALUE double 算术。

关于java - 打印出数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42950458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com