java 除法运算只保留整数位的4种方式 202533952编辑
Heaven helps those who help themselves
资深码农+深耕理财=财富自由
欢迎关注![](https://files.cnblogs.com/files/Marydon20170307/gzh3.bmp)
资深码农+深耕理财=财富自由
欢迎关注
![](https://files.cnblogs.com/files/Marydon20170307/gzh3.bmp)
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 = "秒" ; } |
与君共勉:最实用的自律是攒钱,最养眼的自律是健身,最健康的自律是早睡,最改变气质的自律是看书,最好的自律是经济独立 。
您的一个点赞,一句留言,一次打赏,就是博主创作的动力源泉!
↓↓↓↓↓↓写的不错,对你有帮助?赏博主一口饭吧↓↓↓↓↓↓
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/10671478.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
2018-04-08 js改变下拉框内容
2018-04-08 eclipse 关闭web项目无用校验