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

目录
  • 前言:
  • 方式一: 添加三目运算符逻辑代码
  • 方式二:使用ceil函数
  • 方式三:其他逻辑
  • 最后总结
  • 附:java向上取整函数Math.ceil()

前言:

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整数相除向上取整内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java取整与四舍五入

     四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么简单了.在讲解之间我们先看如下一个经典的案例: public static void main(String[] args) { System.out.println("12.5的四舍五入值:" + Math.round(12.5)); System.out.println("-12.5的四舍五入值:" + Math.round(-12.5)); } Output: 12.5的四

  • java中的取整与四舍五入方法实例

    一.java中取整数的方式 1.直接使用强制转换 public static void roundOne(){ System.out.println("正数:(int)10.12 = " + (int)10.12); System.out.println("负数:(int)-10.12 = " + (int)-10.12); System.out.println("---------------------------------"); Syst

  • JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解

    首先还是看看JavaScript: The Definitive Guide, 4th Edition中对三个函数的定义. Math.ceil(): round a number up Arguments: Any numeric value or expression Returns: The closest integer greater than or equal to x. ---------------------------------------------------------

  • java中的三种取整函数总结

    如下所示: 1. 舍掉小数取整:Math.floor(3.5)=3 2. 四舍五入取整:Math.rint(3.5)=4 3. 进位取整:Math.ceil(3.1)=4 以上这篇java中的三种取整函数总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 浅析java中的取整(/)和求余(%)

    1.取整运算符 取整从字面意思理解就是被除数到底包含几个除数,也就是能被整除多少次,那么它有哪些需要注意的地方呢?先看下面的两端代码: int a = 10; int b = 3; double c= a / b; System.out.println(c); 第一段代码的运行结果是3.0, 其中double c = a / b;//c = (10/3) = (double)3 = 3.0,这里面涉及到一个低精度到高精度的隐式装换. int a = 10; int b = 3; double c

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

    目录 前言: 方式一: 添加三目运算符逻辑代码 方式二:使用ceil函数 方式三:其他逻辑 最后总结 附:java向上取整函数Math.ceil() 前言: Java中两个整数相除,如果不能整除,默认是向下取整的.例如:11 除以 3 的结果是 3.然而,某些情况下(eg. 把11个糖果,每3个分一堆,不足三个也分成一堆,可以分几堆?),我们需要向上取整,这样的情况该如果处理呢? 方式一: 添加三目运算符逻辑代码 x / y + (x % y != 0 ? 1 : 0); 这种方法逻辑上很简单,

  • Java在控制台输出带颜色字符的2种方式详解

    目录 通过\033特殊转义符实现 Linux中的测试效果 IDEA 中的测试效果 Windows控制台测试结果 通过org.fusesource.jansi实现 Windows控制台测试结果 Linux中的测试效果 IDEA 中的测试效果 总结 通过\033特殊转义符实现 这种方法主要适用于Linux系统的控制台,也能在Windows系统中的IDEA中实现,但在Windows系统的控制台中却是乱码. public class ColourTest { /** * @param colour 颜色

  • Java List转换成String数组几种实现方式详解

    Java List转换成String数组 实现代码: List<String> list = new ArrayList<String>(); list.add("a1"); list.add("a2"); String[] toBeStored = list.toArray(new String[list.size()]); for(String s : toBeStored) { System.out.println(s); } 或 Li

  • java高并发的线程中断的几种方式详解

    目录 通过一个变量控制线程中断 通过线程自带的中断标志控制 线程阻塞状态中如何中断? 总结 通过一个变量控制线程中断 代码: package com.itsoku.chat05; import java.util.concurrent.TimeUnit; /** * 微信公众号:路人甲Java,专注于java技术分享(带你玩转 爬虫.分布式事务.异步消息服务.任务调度.分库分表.大数据等),喜欢请关注! */ public class Demo1 { public volatile static

  • psql除法保留小数,实现向上取整和向下取整操作

    在psql中,使用1/4得到的结果是0,因为/它取得是整数,但是有些场景我们是需要保留小数的,还有些场景需要向上取整,或者四舍五入的. 今天就总结下psql保留小数的方法 我用到的方法是类型转换,类似于c中int/int为int类型,而float/int则为float. select round(1::numeric/4::numeric,2) 将除数被除数转换为numeric类型,保留两位小数,此时可以得到 0.25 最近的使用中我是用的是cast转换,如下: MAX(ceil(round(

  • c语言实现向上取整计算方法

    目录 c语言向上取整计算 c语言向上取整的一点技巧 c语言向上取整计算 用整数N 除以 M,要求向上取整数 int n = (N + M -1) / M : 简化后就是: int n= (N - 1) / M +1: 最笨的办法 int n = N / M + ((N % M != 0) ? 1 : 0 ) c语言向上取整的一点技巧 做底层或者说驱动开发时,经常会遇到一些硬件限制,比如 STM32 有些寄存器要求 16 bit 访问.32 bit 访问,否则可能引发 Hardfault 中断:再

  • JavaScript Math.ceil 方法(对数值向上取整)

    JavaScript Math.ceil 方法 Math.ceil 方法用于对数值向上取整,即得到大于或等于该数值的最小整数.语法如下: Math.ceil(x) 参数说明: 参数 说明 x 必需.必须是一个数值. 提示:该方法与 Math.floor 方法正好相反. Math.ceil 方法实例 <script language="JavaScript"> document.write( Math.ceil(0.35) + "<br />"

  • python对一个数向上取整的实例方法

    python中向上取整可以用ceil函数,ceil函数是在math模块下的一个函数. 向上取整需要用到 math 模块中的 ceil() 方法: >>> import math >>> math.ceil(3.25) 4.0 >>> math.ceil(3.75) 4.0 >>> math.ceil(4.85) 5.0 分别取整数部分和小数部分 有时候我们可能需要分别获取整数部分和小数部分,这时可以用 math 模块中的 modf()

  • python ceiling divide 除法向上取整(或小数向上取整)的实例

    向上取整的方法: 方法1: items = 102 boxsize = 10 num_boxes = (items + boxsize - 1) // boxsize 方法2: >>> -(-102 // 10) 11 方法3(浮点数向上取整): from math import ceil print(ceil(10.3)) 11 或 import math math.ceil( x ) 以上这篇python ceiling divide 除法向上取整(或小数向上取整)的实例就是小编分享

  • 对Python 除法负数取商的取整方式详解

    python除法负数商的取整方式与C++不同 python: 5 / -2 = -3 若想和C++行为相同,可以使用 int(operator.truediv(num1, num2)) 返回 a/ b (当启用future.division 时. )这也被称为正除法 python 几种常用的取整方式 1.向下取整 a = 3.75 int(a) 3 2.四舍五入 a = 3.25; b = 3.75 round(a); round(b) 3.0 4.0 3.向上取整 import math a

随机推荐