1、刷题时候,经常遇到的问题就是大数处理,那么选择哪个数据类型,其实为了快速解题,仅仅知道对应数据类型占用字节数目以及二进制能表达的数据类型对应的值的正负范围是不够的,因为这只是宏观上的概念,还要知道对应的十进制的正负范围。所以为了不是每次都手动推一遍,究竟是到了十进制的10的多少次方了,决定还是写一个博客,彻底记录这个问题。
2、测试code:
/**
*/
public class Main {
public static void main(String[] args){
//Scanner scanner=new Scanner(System.in);//在线笔试
int iMin=Integer.MIN_VALUE;
int iMax=Integer.MAX_VALUE;
long lMin=Long.MIN_VALUE;
long lMax=Long.MAX_VALUE;
float fMin=Float.MIN_VALUE;
float fMax=Float.MAX_VALUE;
double dMin=Double.MIN_VALUE;
double dMax=Double.MAX_VALUE;
System.out.println("--------JDK1.8中数字范围测试----");
System.out.println("int 最小值的常量:"+iMin); //左边界大概范围:-Math.pow(10,9); 21474 83647
System.out.println("int 最大值的常量:"+iMax); //右边界大概范围:+Math.pow(10,9);
System.out.println("long 最小值的常量:"+lMin);//左边界大概范围:-Math.pow(10,17) 9223 37203 68547 75808
System.out.println("long 最大值的常量:"+lMax);//右边界大概范围:+Math.pow(10,17)
System.out.println("float 最小正非零值的常数:"+fMin);//左边界大概范围:-Math.pow(10,38)
System.out.println("float 最大正非零值的常数:"+fMax);//右边界大概范围:+Math.pow(10,38)
System.out.println("double 最小正非零值的常数:"+dMin);//左边界大概范围:-Math.pow(10,308)
System.out.println("double 最大正非零值的常数:"+dMax);//右边界大概范围:+Math.pow(10,308)
//test
System.out.println("------------------------------");
float negF=-3.4028235E38F;
System.out.println("最小float值:"+negF);
double negD=-1.7976931348623157E308D;
System.out.println("最小double值:"+negD);
}
}
3、输出结果:
--------JDK1.8中数字范围测试----
int 最小值的常量:-2147483648
int 最大值的常量:2147483647
long 最小值的常量:-9223372036854775808
long 最大值的常量:9223372036854775807
float 最小正非零值的常数:1.4E-45
float 最大正非零值的常数:3.4028235E38
double 最小正非零值的常数:4.9E-324
double 最大正非零值的常数:1.7976931348623157E308
------------------------------
最小float值:-3.4028235E38
最小double值:-1.7976931348623157E308
4、说明:
Q1:float和double最小值不是负数吗?为什么输出的最小值是个正数的表达式?
A1:查看FLOAT.MIN_VALUE源码,我们知道:输出的最小值本来就是一个正数,这个正数表示的是:float能表示的最小的正数,而这个正数就是:1.4乘以10的-45次方。如果想获取float最小值,可以在正数最大值前面添加负号就可以得到。
贴出FLOAT.MIN_VALUE源码:
/**
* A constant holding the smallest positive nonzero value of type
* {@code float}, 2<sup>-149</sup>. It is equal to the
* hexadecimal floating-point literal {@code 0x0.000002P-126f}
* and also equal to {@code Float.intBitsToFloat(0x1)}.
*/
public static final float MIN_VALUE = 0x0.000002P-126f; // 1.4e-45f