java 除法运算只保留整数位的3种方式
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 = "秒";
}
java 除法运算只保留整数位的3种方式的更多相关文章
- Java 整数间的除法运算如何保留所有小数位?
1.情景展示 double d = 1/10; System.out.println(d); 返回的结果居然是0.0!这是怎么回事儿? 2.原因分析 第一步:你会发现用运算结果也可以用int类型接 ...
- 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- Java中创建(实例化)对象的五种方式
Java中创建(实例化)对象的五种方式1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运用反 ...
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- Java Class类以及获取Class实例的三种方式
T - 由此 Class 对象建模的类的类型.例如,String.class 的类型是Class<String>.如果将被建模的类未知,则使用Class<?>. publi ...
- java 的对象拷贝(有深浅拷贝两种方式,深拷贝实现的两种方式(逐层实现cloneable接口,序列化的方式来实现))
Java提高篇--对象克隆(复制)(转自:http://www.cnblogs.com/Qian123/p/5710533.html#_label0) 阅读目录 为什么要克隆? 如何实现克隆 浅克 ...
- Java设置session超时(失效)的三种方式
1. 在web容器中设置(此处以tomcat为例) 在tomcat-6.0\conf\web.xml中设置,以下是tomcat 6.0中的默认配置: <!-- ================= ...
- java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService
前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...
- Java反射机制(创建Class对象的三种方式)
1:了解什么是反射机制? 在通常情况下,如果有一个类,可以通过类创建对象:但是反射就是要求通过一个对象找到一个类的名称: 2:在反射操作中,握住一个核心概念: 一切操作都将使用Object完成,类 ...
随机推荐
- python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...
- POJ 2393 Yogurt factory【贪心】
POJ 2393 题意: 每周可以生产牛奶,每周生产的价格为Ci,每周需要上交的牛奶量Yi,你可以选择本周生产牛奶,也可选择提前几周生产出存储在仓库中(仓库无限大,而且保质期不考虑),每一周存仓库牛奶 ...
- spring 中常用的两种事务配置方式以及事务的传播性、隔离级别
一.注解式事务 1.注解式事务在平时的开发中使用的挺多,工作的两个公司中看到很多项目使用了这种方式,下面看看具体的配置demo. 2.事务配置实例 (1).spring+mybatis 事务配置 &l ...
- bozj 1823(未完成)
题意: 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过专 ...
- EL 表达式截取字符串/替换字符/……
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 下面是 ...
- 【Java】 剑指offer(36) 二叉搜索树与双向链表
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不 ...
- ubuntu16.04通过apt-get方式安装MongoDB
虽然Ubuntu本身也提供MongoDB安装包,但往往官网的安装包版本更新. hupeng@hupeng-vm:~$ apt-cache show mongodb-clients Package: m ...
- 计蒜客-跳跃游戏二 (简单dp)
题目链接:https://nanti.jisuanke.com/t/20 跳跃游戏二 给定一个非负整数数组,假定你的初始 ...
- cglib动态代理导致注解丢失问题及如何修改注解允许被继承
现象 SOAService这个bean先后经过两个BeanPostProcessor,会发现代理之后注解就丢失了. 开启了cglib代理 @SpringBootApplication @EnableA ...
- 【Java并发核心七】计划任务ScheduleExecutorService
Java中定时任务Timer工具类提供了计划任务的实现,但是Timer工具类是以队列的方式来管理线程的,并不是以线程池的方式,这样在高并发的情况下,运行效率会有点低. ScheduleExecutor ...