zoukankan      html  css  js  c++  java
  • java 除法运算只保留整数位的4种方式

    1.情景展示

      根据提供的毫秒数进行除法运算,如果将毫秒数转换成小时,小时数不为0,则只取整数位,依此类推...

    2.情况分析

      可以使用3个函数实现

      Math.floor(num)   只保留整数位

      Math.rint(num)     余数四舍五入

      Math.ceil(num)     取整位,再+1

      举例:

    double num = 3.1415926;
    System.out.println(Math.floor(num));// 3.0
    System.out.println(Math.rint(num));// 3.0
    System.out.println(Math.ceil(num));// 4.0
    

      网上取整的例子到这就结束啦,都说了只取整数位,返回的是一个double类型的数字,所以,还需要强转成整数。

      这次是正确答案!

    double num = 3.1415926;
    System.out.println((int)Math.floor(num));// 3
    System.out.println((int)Math.rint(num));// 3
    System.out.println((int)Math.ceil(num));// 4  

      2019/05/23 补充:

      Java整数之间的除法运算,默认只返回整数位,也就相当于Math.floor()函数了。

      方式四:

    double num = 3.1415926;
    // 直接使用int进行强制转换
    System.out.println((int)num);//3
    num = 3.789;
    System.out.println((int)num);//3
    // 整数运算,默认将运算结果强制转换成了整数(只保留整数位)
    int i4 = 1/10;
    System.out.println(i4);//0
    

    3.解决方案

    // 还差多长时间执行,单位:毫秒数
    long exeTime = 1234567;
    // 时间单位
    String timeUnit = "";
    // 首次执行剩余时间
    int remaTime = 0;
    
    if (Math.floor(exeTime/1000/3600) > 0) {
    	remaTime = (int)Math.floor(exeTime/1000/3600);
    	timeUnit = "小时";
    } else if (Math.floor(exeTime/1000/60) > 0) {
    	remaTime = (int)Math.floor(exeTime/1000/60);
    	timeUnit = "分钟";
    } else {
    	remaTime = (int)Math.floor(exeTime/1000);
    	timeUnit = "秒";
    }
    
    System.out.println("启动定时器...SbptAction...距离任务执行还有" + remaTime + timeUnit + "!"); 

    4.问题扩展

      这样写,有一个问题,如果你的项目使用了SonarLint代码检测工具,原生的代码检测会报错。 

      意思是说:这样的算法很简单,根本不需要调用取整函数,就能知道结果。属于严重错误级别。

      如何规避这个错误检测规则?

    double hours = exeTime/1000/3600;
    double minutes = exeTime/1000/60;
    double seconds = exeTime/1000;
    
    if (Math.floor(hours) > 0) {
    	remaTime = (int)Math.floor(hours);
    	timeUnit = "小时";
    } else if (Math.floor(minutes) > 0) {
    	remaTime = (int)Math.floor(minutes);
    	timeUnit = "分钟";
    } else {
    	remaTime = (int)Math.floor(seconds); 
    	timeUnit = "秒";
    }
    

      使用上述代码进行替换,就不会报严重错误了!

    5.最佳解决方案

      当我知道Java整数之间的除法运算,默认只返回整数位时,才恍然大悟,上面的校验规则报错的原因:

      因为运算结果本身返回只有整数位,虽然结果用double接收的,但其本质仍然是个整数,

      所以,就没有必要调用Math.floor()来只取整数位了,直接强制转换成int就可以了!

    // Java整数间的除法运算,默认只保留整数位
    double hours = exeTime/1000/3600;
    double minutes = exeTime/1000/60;
    double seconds = exeTime/1000;
    
    // hours,minutes,seconds的结果只可能为0.0/1.0/2.0等(即小数位永远为0),不可能为:0.1/1.1/2.1 if (hours > 0) { remaTime = (int)hours; timeUnit = "小时"; } else if (minutes > 0) { remaTime = (int)minutes; timeUnit = "分钟"; } else { remaTime = (int)seconds; timeUnit = "秒"; }

    写在最后

      哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

     相关推荐:

  • 相关阅读:
    我的黑客偶像
    2020-2021-1学期 学号20201222 《信息安全专业导论》第5周学习总结
    XOR加密
    pep/9
    我的黑客偶像
    学年2020-2021,1 学号:20201222《信息安全专业导论》第4周学习总结”
    IEEE754浮点数转换
    师生关系
    罗马数字转阿拉伯数字
    第三周总结
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/10671478.html
Copyright © 2011-2022 走看看