Java数据类型-黑客等级

Java数据类型-黑客等级,java,types,Java,Types,我试图解决黑客等级的一个问题,所以我要做的是列出(代码的解释),我已经设法使代码运行和工作,但它失败了两个测试 这是我的密码 import java.util.Scanner; public class JavaDatatypes { public static void main(String[] argh) { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); for

我试图解决黑客等级的一个问题,所以我要做的是列出(代码的解释),我已经设法使代码运行和工作,但它失败了两个测试

这是我的密码

import java.util.Scanner;

public class JavaDatatypes {
    public static void main(String[] argh) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for (int i = 0; i < t; i++) {
            try {
                long x = sc.nextLong();
                System.out.println(x + " can be fitted in:");

                int[] bits = {8, 16, 32, 64};
                String[] strings = {"byte", "short", "int", "long"};
                for (int j = 0; j < bits.length; j++) {
                    long range = (long) (Math.pow(2, bits[j] - 1));
                    if (x >= -range && x <= range -1) {
                        System.out.println("* " + strings[j]);
                    }
                }
                //Complete the code
            } catch (Exception e) {
                System.out.println(sc.next() + " can't be fitted anywhere.");
            }
        }
    }
}
import java.util.Scanner;
公共类JavaDatatypes{
公共静态void main(字符串[]argh){
扫描仪sc=新的扫描仪(System.in);
int t=sc.nextInt();
for(int i=0;i如果(x>=-range&&x代码中的问题是使用了
双功率(双a,双b)
。当结果接近
长最大值时,结果是四舍五入的。您可以通过
BIINTEGER
进行检查:

String str1 = BigInteger.valueOf(2).pow(bits[j] - 1).toString();
String str2 = String.valueOf((long)Math.pow(2, bits[j] - 1));

这些字符串每次都应该相等,但对于
2^16
,情况并非如此。这就是为什么
2^16
x=Byte.MIN\u值&&x=Short.MIN\u值&&x=Integer.MIN\u值&&x>代码中的问题是使用了
double-pow(double-a,double-b)
。当结果接近
Long.MAX\u值时
-结果是四舍五入的。您可以通过
bitineger
进行检查:

String str1 = BigInteger.valueOf(2).pow(bits[j] - 1).toString();
String str2 = String.valueOf((long)Math.pow(2, bits[j] - 1));

这些字符串每次都应该相等,但对于
2^16
,情况并非如此。这就是为什么对于
2^16
您的
x=Byte.MIN\u值&&x=Short.MIN\u值&&x=Integer.MIN\u值&&x>忽略检查64位和
long

如果
long x=sc.nextLong();
成功,则您已经知道该数字适合
long
类型。因此,如果没有异常,您始终可以打印“*long”

关于使用
Math.pow()
:它基于浮点运算,因此可能涉及较小的舍入误差。2的幂可以通过位移位计算,因此

long range = (long) (Math.pow(2, bits[j] - 1))
可以用

long range = 2L << (bits[j] - 1)

long-range=2L只需省略对64位和
long的检查即可

如果
long x=sc.nextLong();
成功,则您已经知道该数字适合
long
类型。因此,如果没有异常,您始终可以打印“*long”

关于使用
Math.pow()
:它基于浮点运算,因此可能涉及较小的舍入误差。2的幂可以通过位移位计算,因此

long range = (long) (Math.pow(2, bits[j] - 1))
可以用

long range = 2L << (bits[j] - 1)

long-range=2L实际输出是什么?您试图用代码做什么?@dan1st因为您没有包括实际输出和输入(您只包括一个测试用例的输入)还有你的代码应该做什么。@dan1st我只包含了错误的输入。我们不需要更多的实际输出是什么?你想用你的代码做什么?@dan1st因为你没有包含实际的输出和输入(你只包含了一个测试用例的输入)还有你的代码应该做什么。@dan1st我只包含了错误的输入。我们不需要更多的输入。我宁愿按照我的方式来做,我只是想在我的代码中找到问题。@SamHoque添加了注释,使用bigigger修复了它,奇怪的是math.pow不起作用。我宁愿按照我的方式来做,我只是想在我的代码中找到问题。@SamHoque添加了注释,使用bigigger修复了它,奇怪的是math.pow不起作用。返回运算符“在
2L中没有
double
返回运算符”在
2L中没有
double