public class Main
{
public static void main(String[] args)
{
double d = 50003598627370496L;
System.out.println(d);
double a = 45035996273704964L;
System.out.println(a);
}
}
//输出:
5.0003598627370496E16
4.503599627370496E16
Process finished with exit code 0
为什么数值小的整数精准度被砍了一位,但是数值大的却完整的保留了所有数据?
不是应该数值超过一定界限才会砍精准度吗?
这个是有效数字的问题,他的有效数字不是根据10进制的位数,而是二进制的位数算的,double的有效数字是53位二进制,超出的部分都会被当成0
System.out.println(Long.toBinaryString(50003598627370496L));
System.out.println(Long.toBinaryString(45035996273704964L));
System.out.println(Long.toBinaryString(50003598627370496L).substring(0, 53));
System.out.println(Long.toBinaryString(45035996273704964L).substring(0, 53));
System.out.println(Long.parseLong("10110001101001100000001000001101101011001111011000000000", 2));
System.out.println(Long.parseLong("10100000000000000000000000000000000000000000000000000000", 2));
转成二进制后取53位再补上0直到和原来的位数相同
10110001101001100000001000001101101011001111011000000000
10100000000000000000000000000000000000000000000000000100
10110001101001100000001000001101101011001111011000000
10100000000000000000000000000000000000000000000000000
50003598627370496
45035996273704960
System.out.println(Double.MAX_VALUE); //2的1024次方-1,308个数位,是float数位的10倍,主要用来做复杂运算和天文运算
System.out.println(Double.MIN_VALUE); //2的-1074次方