java 除法运算只保留整数位的4种方式 202533952编辑

Heaven helps those who help themselves
资深码农+深耕理财=财富自由
欢迎关注

java 除法运算只保留整数位的4种方式

Created by Marydon on 2019-04-08 16:42

1.情景展示

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

2.情况分析

  可以使用3个函数实现

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

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

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

  举例:

1
2
3
4
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类型的数字,所以,还需要强转成整数。

  这次是正确答案!

1
2
3
4
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()函数了。

  方式四:

1
2
3
4
5
6
7
8
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.解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 还差多长时间执行,单位:毫秒数
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代码检测工具,原生的代码检测会报错。 

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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就可以了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Java整数间的除法运算,默认只保留整数位
double hours = exeTime/1000/3600;
double minutes = exeTime/1000/60;
double seconds = exeTime/1000;
<br>// 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 = "秒";
}

 

写在最后

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

 相关推荐:

 

与君共勉:最实用的自律是攒钱,最养眼的自律是健身,最健康的自律是早睡,最改变气质的自律是看书,最好的自律是经济独立 。

您的一个点赞,一句留言,一次打赏,就是博主创作的动力源泉!

↓↓↓↓↓↓写的不错,对你有帮助?赏博主一口饭吧↓↓↓↓↓↓

posted @   Marydon  阅读(33952)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
历史上的今天:
2018-04-08 js改变下拉框内容
2018-04-08 eclipse 关闭web项目无用校验
点击右上角即可分享
微信分享提示
sorry,本博客所有代码禁止复制,原创代码需扫码支付方可获取!
关闭

1、先加好友再付费,点我加好友;

2、代码不能满足你的需求?加好友付费定制你的专属代码!

3、付费标准及方式,点我查看详情。