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种方式的更多相关文章

  1. Java 整数间的除法运算如何保留所有小数位?

      1.情景展示 double d = 1/10; System.out.println(d); 返回的结果居然是0.0!这是怎么回事儿? 2.原因分析 第一步:你会发现用运算结果也可以用int类型接 ...

  2. 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  3. Java中创建(实例化)对象的五种方式

    Java中创建(实例化)对象的五种方式1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运用反 ...

  4. Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  5. Java Class类以及获取Class实例的三种方式

    T - 由此 Class 对象建模的类的类型.例如,String.class 的类型是Class<String>.如果将被建模的类未知,则使用Class<?>.   publi ...

  6. java 的对象拷贝(有深浅拷贝两种方式,深拷贝实现的两种方式(逐层实现cloneable接口,序列化的方式来实现))

    Java提高篇--对象克隆(复制)(转自:http://www.cnblogs.com/Qian123/p/5710533.html#_label0)   阅读目录 为什么要克隆? 如何实现克隆 浅克 ...

  7. Java设置session超时(失效)的三种方式

    1. 在web容器中设置(此处以tomcat为例) 在tomcat-6.0\conf\web.xml中设置,以下是tomcat 6.0中的默认配置: <!-- ================= ...

  8. java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService

    前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...

  9. Java反射机制(创建Class对象的三种方式)

    1:了解什么是反射机制? 在通常情况下,如果有一个类,可以通过类创建对象:但是反射就是要求通过一个对象找到一个类的名称:   2:在反射操作中,握住一个核心概念: 一切操作都将使用Object完成,类 ...

随机推荐

  1. 51nod1185 威佐夫游戏 V2 (模拟乘法)

    1185 威佐夫游戏 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取 ...

  2. 《剑指offer》-青蛙跳台阶II

    一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 其实题目很水...就是一个等比数列通项公式嘛 f(0)=1 f(1)=1 f(n)=f( ...

  3. [CQOI2017]老C的任务

    题解: 裸的主席树吧 要想避免带修主席树的话先排序一下吧

  4. 交叉编译和安装ARM板(RK3288)和Linux 3.10上的RTL8188无线网卡驱动

    插入无线网卡,输入ifconfig,发现没有检测到网卡. 输入lsusb,查看无线网卡型号. 我用的无线网卡是EDUP的网卡,包装盒里有一张驱动光盘,把光盘里linux下的驱动目录复制下来.如果没有驱 ...

  5. java:利用java的输入/输出流将一个文件的每一行+行号复制到一个新文件中去

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  6. Redis数据结构之list

    一:介绍 1.存储list ArrayList使用数组的方式 LinkedList使用双向链接的方式 二:Redis客户端 1.左端与右端插入 2.左端查询 3.左端与右端弹出 4.长度 5.在头部插 ...

  7. 016 SpringMVC中重定向

    1.介绍 2.index <%@ page language="java" contentType="text/html; charset=utf-8" ...

  8. 在jupyter notebook导入tensorflow出错:No module named tensorflow 解决办法

    1.背景 首先说一下我的环境: os : windows10 anaconda版本:2.7 官网提供了两种方法来安装TensorFlow:pip和anaconda.我使用的是anaconda方法.按照 ...

  9. java中如何不自己写排序方法完成排序

    1.如果要排序的东西是放在一个数组里面的 1.1如果要排序的东西是基本数据类型,如int int[] c=new int[]{4,5,1,2,3,6,9}; Arrays.sort(c); Array ...

  10. 利用python计算多边形面积

    最近业务上有一个需求,给出多边形面积. Google了一下,发现国内论坛给的算法都是你抄我我抄你,也不验证一下是否正确, 从 博客园到csdncsdn 然后传播到国内各个角落...真是无力吐槽了. 直 ...