Java两整数相除向上取整的方式详解(Math.ceil())

 更新时间:2022年06月15日 16:01:48   作者:明月几时有666  
在调外部接口获取列表数据时,需要判断是否已经取完了所有的值,因此需要用到向上取整,下面这篇文章主要给大家介绍了关于Java两整数相除向上取整的相关资料,需要的朋友可以参考下

前言:

Java中两个整数相除,如果不能整除,默认是向下取整的。例如:11 除以 3 的结果是 3。然而,某些情况下(eg. 把11个糖果,每3个分一堆,不足三个也分成一堆,可以分几堆?),我们需要向上取整,这样的情况该如果处理呢?

方式一: 添加三目运算符逻辑代码

x / y + (x % y != 0 ? 1 : 0);

这种方法逻辑上很简单,如果x可以整除y,就将x / y 的结果加0,不能整除y就将x / y 的结果加1。

方式二:使用ceil函数

 (int)Math.ceil((double)x/y);
 // 或者
 (int)Math.ceil(x * 1.0 /y);

首先,将被除数转换成double类型,再将计算的结果通过Math.ceil()函数向上取整,这种方式是网上经常可以看到的方式。

方式三:其他逻辑

(x + y - 1) / y

这种方式为什么可以达到向上取整的效果呢,为什么x要加y - 1?

为了方便理解,我们通过具体的计算来说明。

1.对于可以整除的情况

x = 9,y = 3

(x + (y - 1)) / y,x加上了一个比y小的数,最终(x + (y - 1)) / y = (x / y) ...y - 1

商为(x / y), 余数为(y - 1),余数相当于两数相除结果都小数部分,会被舍去,最终(x + (y - 1)) / y` = (x / y)

2.对于不可以整除的情况

x = 11, y = 3

11 / 3 = 3 ... 2

x + (y - 1) = (3 * 3 + 2) + (3 - 1) = (3 * 3 + 2 - 1)+ 3= (3 * 3 + 3) + 2 - 1

x + (y - 1) / y = ((3 * 3 + 3) + 2 - 1 )/ 3 = 4

就是x不能整除y余数肯定在1到y - 1之间,从中取出1给y - 1,使得被除数增加了一个y,进而商会增加1,余数部分为0到y - 2是会被舍去的。

最后总结

第一种方法:最简单、清楚,是比较推荐的;

第二种方法:虽然常见,但是涉及过多类型转换,个人不推荐

第三种方法:很巧妙,不太容易理解,也是推荐的

附:java向上取整函数Math.ceil()

java向上取整函数Math.ceil()

百度Math.ceil()函数:“Math.ceil()是常见编程语言中的常用代码,ceil() 方法执行的是向上取整计算,它返回的是大于或等于函数参数,并且与之最接近的整数。“

Math.ceil(param)使用实例:

		double dividend = 7;	// 被除数
		double divisor = 2;		// 除数
		double flag = 0;	
		int result1 = 0;
		int result2 = 0;
		
		// 函数式
		flag = Math.ceil(dividend / divisor);		//向上取整计算
		result1 = (int)flag;			//将结果转化为int数据类型
		
		// 判断式:整除法
		if ((dividend % divisor) == 0) {
			result2 = (int)dividend / (int)divisor;               // 将操作数转化为int型数据
		} else {
			result2 = ((int)dividend / (int)divisor) + 1;         // 将操作数转化为int型数据
		}
 
		Object[] options = { "成功", "取消" };
		JOptionPane.showOptionDialog(null, "函数ceil求值=" + result1 + "; 判断求值=" +result2, 
			"Warning",JOptionPane.DEFAULT_OPTION, 
			JOptionPane.WARNING_MESSAGE,null, options, options[0]); 

结果为所要的:(函数式与整除判断式等效)

注意:

两个限制:判断式,适用于整除;其操作数为int(Integer)数据类型,否则,得不到想要的效果。函数式,若使用int(Integer)作为操作数(参数),需要特别注意:

		double dividend = 7;	// 被除数
		double divisor = 2;		// 除数
		double flag = 0;	
		int result1 = 0;
		int result2 = 0;
		
		// 函数式
		// ① (int)dividend / (int)divisor 将计算结果直接转换为int型,因此这里的结果为3
		//(int 类型丢失精度,即小数点之后的数丢失,本例的 3.5 丢失了0.5;
		// 这里涉及 高精度数 向 低精度数 转化时,会丢失精度。
		// 精度从低到高 int < double < float).
		// ② Math.ceil(3)函数执行,向上取整,也是3 
		// 感谢 博友“ws458371436” 的纠正,之前这个地方是糊涂的,还好有博友的细心,避免再误导其他朋友
		flag = Math.ceil((int)dividend / (int)divisor);	// 向上取整计算int = Math.ceil(int),对int整数取整,纯属多余! 
 
		result1 = (int)flag;		//将结果转化为int数据类型
		
		// 判断式:整除法
		if ((dividend % divisor) == 0) {
			result2 = dividend / divisor;                    // 保持double型数据类型
		} else {
			result2 = (dividend / divisor) + 1;             // 保持double型数据类型
		}
 
		Object[] options = { "成功", "取消" };
		JOptionPane.showOptionDialog(null, "函数ceil求值=" + result1 + "; 判断求值=" +result2, 
			"Warning",JOptionPane.DEFAULT_OPTION, 
			JOptionPane.WARNING_MESSAGE,null, options, options[0]); 

测试结果:

总结:函数(接口),都具有它的适应范围和限制条件,正是这些条件,标定了基本功能,有准确的指向,得出特定效果。这也是智能。

到此这篇关于Java两整数相除向上取整的文章就介绍到这了,更多相关Java整数相除向上取整内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java和c/c++ 数据类型长度的比较

    java和c/c++ 数据类型长度的比较

    本篇文章主要是对java和c/c++ 数据类型长度的进行了详细的比较。需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • 若依框架多数据源切换方式

    若依框架多数据源切换方式

    这篇文章主要介绍了若依框架多数据源切换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java发送email一般步骤(实例讲解)

    java发送email一般步骤(实例讲解)

    下面小编就为大家带来一篇java发送email一般步骤(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • java判断一个文件是否为二进制文件的方法

    java判断一个文件是否为二进制文件的方法

    这篇文章主要介绍了java判断一个文件是否为二进制文件的方法,涉及java针对文件的读取及编码判断技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 浅谈java中的重载和重写的区别

    浅谈java中的重载和重写的区别

    本文主要介绍了java中的重载和重写的区别。具有一定的参考价值,下面跟着小编一起来看下吧,希望能够给你带来帮助
    2021-11-11
  • Java中日期与时间的处理及工具类封装详解

    Java中日期与时间的处理及工具类封装详解

    在项目开发中免不了有对日期时间的处理,但Java中关于日期时间的类太多了,本文就来介绍一下各种类的使用及我们项目中应该怎么选择吧
    2023-07-07
  • 基于@GetMapping注解携带参数的方式

    基于@GetMapping注解携带参数的方式

    这篇文章主要介绍了基于@GetMapping注解携带参数的方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Spring框架实现AOP添加日志记录功能过程详解

    Spring框架实现AOP添加日志记录功能过程详解

    这篇文章主要介绍了Spring框架实现AOP添加日志记录功能过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 图解Spring容器中实例化bean的四种方式

    图解Spring容器中实例化bean的四种方式

    这篇文章主要介绍了图解Spring容器中实例化bean的四种方式,传统应用程序可以通过new和反射方式进行实例化Bean,而Spring IOC容器则需要根据 Bean 定义里的配置元数据,使用反射机制来创建Bean,需要的朋友可以参考下
    2023-11-11
  • springboot配置多数据源并集成Druid和mybatis的操作

    springboot配置多数据源并集成Druid和mybatis的操作

    这篇文章主要介绍了springboot配置多数据源并集成Druid和mybatis的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论