"<"之间的差异小于操作员和"< ="使用pow(x,y)比较大数字时的运算符

时间:2015-07-23 08:23:46

标签: java types operators

当我尝试将数字9223372036854775807与Math.pow(2,63)进行比较时,它给出了错误的答案。这是代码

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

这不打印任何东西,而当我这样做时它确实

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

实际的节目就是这个......

package practice;

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Ques2ofHR_database {

public static void main(String[] args) {

    int i;
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    for (i = 0; i < n; i++) {

        long s =0;
    try {
            s = in.nextLong();

        } catch (InputMismatchException e) {
            System.out.println(in.next() + " can't be fitted anywhere.");

            continue;
        }


    System.out.println(s + " can be fitted in:");
        if ((s < Math.pow(2, 7)) && (s >= -Math.pow(2, 7)))
            System.out.println("* byte");

        if ((s < Math.pow(2, 15)) && (s >= -Math.pow(2, 15)))
            System.out.println("* short");

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

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

    }

    }

}

这个程序实际上找出了可以存储给定数字的所有数据类型(在byte,short,int和long之间)

和感谢提前......

1 个答案:

答案 0 :(得分:1)

tsxs -o null-transform.so null-transform.cc 需要64位才能适合长变量。

Long.MAX_VALUE返回一个双精度数。 double使用相同数量的位(64)来近似更大的浮点数(指数使用了一些位),因此Math.pow(2,63)不能等于Math.pow(2,63),因为{ {1}}无法用双变量准确表示。

编辑:

实际上,Long.MAX_VALUE可以在双变量中准确表示,因为它是2的幂,指数相对较小。但是,当您从中减去1时,会得到一个无法在双变量中准确表示的数字。