1.情景展示

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

2.情况分析

  可以使用3个函数实现

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

  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  

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代码检测工具,原生的代码检测会报错。 

 java 除法运算只保留整数位的3种方式 随笔

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

  吐槽:这个规则很傻逼,它根本不知道咋回事,还说你愚蠢。

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

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 = "秒";
}

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

 

写在最后

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

 相关推荐:

 

 
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄