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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • flex布局以及实现垂直居中

    flex布局以及实现垂直居中flex布局的原理给父盒子添加flex属性,来控制盒子的位置和排列方式(当我们给父元素设置为flex布局以后,子元素的float、clear和vertical-align属性将失效)flex:布局又叫伸缩布局,弹性布局,伸缩盒布局,flex布局flex常见的父项常见属性flex-direction:设置主轴的方向justify-content:设置主轴上的子元素排列方式flex-wrap:设置子元素是否换行align-content:设置侧轴上的子元素的排列方式(多行)align-items

    2022年6月6日
    324
  • linux如何mount挂载磁盘并设置开机自动mount

    linux如何mount挂载磁盘并设置开机自动mount知道大家时间都很宝贵,我直接把流程命令写下来,大家配置完即可,想研究原理的话就往下读fdisk-l#查看可挂载的磁盘df-h#查看已经挂载的磁盘mkfs.ext4/dev/vdb#初始化磁盘mount/dev/vdb/u01…

    2022年6月19日
    27
  • Keil(MDK-ARM)使用教程——在线调试

    Keil(MDK-ARM)使用教程——在线调试Keil(MDK-ARM)使用教程(三)_在线调试由于我是直接使用(打开现有的软件工程),如果跟着需要下载上面演示参考的软件工程才行。工程默认是使用硬件在线调试,接下来按照每一点来讲述。 1.编译+调试打开软件工程 -&gt; 编译 -&gt; 调试这里的编译建议使用BuildTarget(第2个按钮)编译工程(如下图动画),也就是使用快捷键F7。Translate(第1个按钮)是编译当前活动文…

    2022年5月23日
    40
  • log4j使用教程_log4js

    log4j使用教程_log4js简介Log4J是Apache的一个开源项目(官网http://jakarta.apache.org/log4j),通过在项目中使用Log4J,我们可以控制日志信息输出到控制台、文件、GUI组件、甚至是数据库中。我们可以控制每一条日志的输出格式,通过定义日志的输出级别,可以更灵活的控制日志的输出过程。方便项目的调试。组成Log4J主要由Loggers(日志记录器)、Ap…

    2025年9月13日
    5
  • 树莓派小车C语言循迹,自动循迹小车_单片机/STM32/树莓派/Arduino/开发板创意项目-聚丰项目-电子发烧友网…[通俗易懂]

    树莓派小车C语言循迹,自动循迹小车_单片机/STM32/树莓派/Arduino/开发板创意项目-聚丰项目-电子发烧友网…[通俗易懂]1金属探测模块采集与计算金属探测LDC1314是根据电磁感应原理制成的,将一金属置于变化的磁场当中时,根据电磁感应原理就会在金属内部产生涡流,涡流产生的磁场反过来又影响原磁场,这种变化可以转换为电压幅值的变化,供相关电路进行检测。通过改变金属和线圈之间的距离得到不同的值,对前端探测到的数据进行再处理和分析,当其中一个线圈探测到铁丝则让小车向相反方向前进,若发现附近有硬币存在该探测器发出声音警报。L…

    2022年5月6日
    64
  • 【详细教程·本人亲测】解决win10家庭版系统C:\Users用户名中有中文,更改为英文的问题

    【详细教程·本人亲测】解决win10家庭版系统C:\Users用户名中有中文,更改为英文的问题【本人亲测】解决win10家庭版系统C:\Users用户名更改的问题【前言】新电脑刚买来,自带win10系统,激活时注册用户名和密码,为了方便记忆把用户名设为中文。随着后来学习和工作软件越装越多,在学习软件开发才发现Users必须为英文,此时重装系统成本极大!因此本人花了大量时间在网上寻找解决方案。但是基本上不适合win10家庭版。终于最后搜到一个方案解决,深知不易,特分享给各位。<第一…

    2022年5月30日
    45

发表回复

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

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