java 向上取整方法 Math.ceil() 用法、源码分析

java 向上取整方法 Math.ceil() 用法、源码分析刷题用到了,正好好好看看源码。

大家好,又见面了,我是你们的朋友全栈君。

刷题用到了,正好好好看看源码。

用法

Math.ceil() 返回值、参数均为double类型, 如果参数为int类型,idea不会报错,但是方法同时不会向上取整。

参数为int类型时,Math.ceil(3*1.0 / 2)。

ctrl + 左键 点进源码

public static double ceil(double a) {
        return StrictMath.ceil(a); // default impl. delegates to StrictMath
}

源码分析

Math.java:

public static double ceil(double a) {
        return StrictMath.ceil(a); // default impl. delegates to StrictMath
}

StrictMath.java:

 //向上取整
 public static double ceil(double a) {                                     
     return floorOrCeil(a, -0.0, 1.0, 1.0);                                
 }                                                                         
                                                                           
 //向下取整                                       
 public static double floor(double a) {                                    
     return floorOrCeil(a, -1.0, 0.0, -1.0);                               
 }                                                                         
                                                                           
                                                                  
 private static double floorOrCeil(double a,                               
                                   double negativeBoundary,                
                                   double positiveBoundary,                
                                   double sign) {                          
     int exponent = Math.getExponent(a);//获取a的指数                                   
                                                                           
     if (exponent < 0) { //如果参数的指数的绝对值小于0,那么一定-1<a<1                                                                                                                
         return ((a == 0.0) ? a :                                          
                 ( (a < 0.0) ?  negativeBoundary : positiveBoundary) );
                    //如果参数为0.0就直接返回
                    //为负数就返回 negativeBoundary(负边界)
                    //为正数就返回 positiveBoundary(正边界)   
     } else if (exponent >= 52) {                                                                                                        
         return a;//指数大于52 超出了double的范围 为无穷大直接返回                                                         
     }
     //此时指数在[0,51]                                                                                                              
     assert exponent >= 0 && exponent <= 51;                               
                                                                           
     long doppel = Double.doubleToRawLongBits(a);                      
     long mask   = DoubleConsts.SIGNIF_BIT_MASK >> exponent;               
                                                                           
     if ( (mask & doppel) == 0L )                                          
         return a;                                      
     else {                                                                
         double result = Double.longBitsToDouble(doppel & (~mask));        
         if (sign*a > 0.0)                                                 
             result = result + sign;                                       
         return result;                                                    
     }                                                                     
 }                                                                         
                                                                                                                                                  

下面着重看一下这些代码:

long doppel = Double.doubleToRawLongBits(a); //doppel时a的二进制格式                      
long mask   = DoubleConsts.SIGNIF_BIT_MASK >> exponent;               
//mask 是获得a的小数位的掩码,mask & doppel获得a的小数位,如果a的小数位为0那么a是整数,则直接返回。                                                                           
if ( (mask & doppel) == 0L )                                          
     return a;                                      
else {
     //result将a的小数部分去掉,获得a的整数。                                                                
     double result = Double.longBitsToDouble(doppel & (~mask)); 
     //sign为1时  为ceil调用  sign为-1时 为floor调用       
     if (sign*a > 0.0)                                                 
         result = result + sign;                                       
     return result;                                                    
}     
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151834.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Windows Server 2012及以上安装IIS的步骤「建议收藏」

    Windows Server 2012及以上安装IIS的步骤

    2022年2月23日
    45
  • ov7725摄像头人脸识别_图像采集是干什么的

    ov7725摄像头人脸识别_图像采集是干什么的目前FPGA用于图像采集传输处理显示应用越来越多,主要原因是图像处理领域的火热以及FPGA强大的并行处理能力。本文以OV7725为例,对摄像头使用方面的基础知识做个小的总结,为后续做个铺垫。  XCLK:工作时钟输入,由主控器产生,频率为24MHz;    HREF:行参考信号输出;  PCLK:像素时钟输出,由XCLK产生,用于控制器采样图像数据(时钟速率&amp;lt;5n…

    2022年9月23日
    3
  • easyui 日期控件清空值

    easyui 日期控件清空值

    2022年1月21日
    46
  • 【XRT Vitis-Tutorials】视频处理加速(Kernel+VCU)

    【XRT Vitis-Tutorials】视频处理加速(Kernel+VCU)1前言前面文章导航:ZCU106XRT环境搭建ZCU106XRTVivado工程分析ZCU106XRTPetaLinux工程分析【XRTVitis-Tutorials】RTLKernels测试【XRTVitis-Tutorials】C++/RTLKernel混合编程测试【XRTVitis-Tutorials】图像并行计算【XRTVitis-Tutorials…

    2022年7月12日
    25
  • MD编辑器设置字体、颜色、大小

    MD编辑器设置字体、颜色、大小颜色:浅红色文字:浅红色文字:深红色文字:深红色文字浅绿色文字:浅绿色文字深绿色文字:深绿色文字浅蓝色文字:浅蓝色文字深蓝色文字:深蓝色文字浅黄色文字:浅黄色文字深黄色文字:深黄色文字浅青色文字:浅青色文字深青色文字:深青色文字浅紫色文字:浅紫色文字深紫色文字:深紫色文字大小:size为1:size为1size为2:size为2size为3:size为3size为4:size为4size为10:size为10字体:我是黑体字我是宋体字我是微软雅黑字我是fanta

    2025年11月23日
    4
  • spring事务回滚的多种方式「建议收藏」

    spring事务回滚的多种方式「建议收藏」转:https://www.cnblogs.com/zeng1994/p/8257763.htmlstart看下下面的说明,会对理解本人贴出的代码有帮助。1.代码中事务控制的3种方式编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚。优点就是可以灵活控制,缺点就是太麻烦了,太多重复的代码了。声明式事务:就是使用SpringAop配置事务,这种方式大大的简化了编码。需要注…

    2022年10月19日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号