背景:今天突发奇想看看自己活了多少天,活了多少岁,然后通过一个小Java demo去计算看下。
问题:在计算日期的时候是正常的,但是计算年龄的时候出现了问题,最后定位到原因是60*24*60*1000*365
超出int类型的值域范围
结论:经过验证,发现当超出范围时候,Java内部机制会去掉前面多余的二进制位数,重新计算,具体代码展示。
public class MyTest {
public static void main(String[] args) {
SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-hh");
try {
Long start = dt.parse("1994-11-02").getTime();
Long ends = dt.parse("2022-06-05").getTime();
Long day = ends-start;
System.out.println("我已经活了"+day/(60*24*60*1000)+"天");
/* 从数学上来说 A/(B*C) = A/B/C 发现错误的时候 还特意用数学的方式去看了 应该是一致的
后面单独打印60*24*60*1000 60*24*60*1000*365 发现了问题 应该是超出int值的范围
问题:超出int值域范围会怎么展示 通过以下结论
结论:会去掉多余的位,重新计算
*/
System.out.println("错误的展示-----我已经活了"+day/(60*24*60*1000*365)+"岁");
System.out.println("正确的展示-----我已经活了"+day/(60*24*60*1000)/365+"岁");
System.out.println("int类型:60*24*60*1000*365转为二进制为"+Integer.toBinaryString(60*24*60*1000*365));
System.out.println("int类型:60*24*60*1000*365转为二进制为"+Integer.toBinaryString(60*24*60*1000*365).length());
Long b = 60*24*60*1000*365l;
System.out.println("b="+b);
System.out.println("Long类型:60*24*60*1000*365转为二进制为"+Long.toBinaryString(b));
System.out.println("Long类型:60*24*60*1000*365转为二进制为"+Long.toBinaryString(b).length());
System.out.println("把35位的二进制去掉前四个 从二进制转为10进制为:"+Integer.parseInt("1010111101100010010110000000000",2));
int a = Integer.MAX_VALUE-1;
System.out.println("int的最大值为:"+a);
System.out.println(day/2147483647);
} catch (Exception e) {
e.printStackTrace();
}
//getIntValue(); 当count+1 会一直加 加到最大值 然后因为Java内部机制变为-2的8次方-1 然后开始+1 因为是死循环 所以会一直循环下去
}
/**
* 有趣的实验 int值域相关
* 有个陷阱啊 就是加载到一定程度会重新开始
*/
public static void getIntValue(){
int count = 0 ;
while (true) {
count++;
if(count<20) {
System.out.println("此时的count值为:"+count+"hello world");
}
// else {break;} //不加这一句会一直循环下去
}
}
}
版权声明:本文为weixin_42651231原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。