Java整数相除向上取整
明月几时有666 人气:1前言:
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]);
测试结果:
总结:函数(接口),都具有它的适应范围和限制条件,正是这些条件,标定了基本功能,有准确的指向,得出特定效果。这也是智能。
加载全部内容