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)
上一篇 2022年6月21日 下午3:36
下一篇 2022年6月21日 下午3:36


相关推荐

  • Letsencrypt简单教程调整

    Letsencrypt简单教程调整Letsencrypt 简单教程 一文较为详细地介绍了 Letsencrypt 的安装以及使用方法 然而 最近在一台服务器部署 letsencrypt 时 执行 letsencrypt auto 命令出现错误 letsencrypt autohelpallS autoisdeprec Yoursystemis autoanymore

    2026年1月25日
    2
  • ZDH大数据采集平台-采集mysql数据到hdfs

    ZDH大数据采集平台-采集mysql数据到hdfs目录项目源码创建mysql数据源创建本地hdfs数据源配置采集任务配置调度点击执行记录查看具体日志高级使用项目源码数据采集平台管理端https://github.com/zhaoyachao/zdh_web数据采集平台服务https://github.com/zhaoyachao/zdh_serverweb端在线查看http://zycblog.cn:8081/login用户名:zyc密码:123456界面只是为了参考功能,底层的数据.

    2022年6月10日
    92
  • java线程池 面试题(精简)

    java线程池 面试题(精简)什么是线程池?线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。 为什么要使用线程池?创建线程和销毁线程的花销是比较大的,这些时间有可能比处理业务的时间还要长。这样频繁的创建线程和销毁线程,再…

    2022年6月13日
    43
  • Claude 3.7 API完全使用指南:8种调用方法详解【2025最新】

    Claude 3.7 API完全使用指南:8种调用方法详解【2025最新】

    2026年3月16日
    2
  • forEach跳出、终止循环

    forEach跳出、终止循环1 forEach 跳出本次循环可使用 return 语句跳出本次循环 执行下一次循环 vararr 1 2 3 4 5 6 arr forEach item gt if item 3 return console log item 将输出 12456 3 不会输出 2 forEach 终止循环 forEach 无法通过正常流程 如 break 终止循环 但可通过抛出异常的方式实现终止循环 vararr 1 2 3 4

    2026年3月16日
    1
  • 零基础掌握Grok-2部署:打造个人专属AI助手的完整教程

    零基础掌握Grok-2部署:打造个人专属AI助手的完整教程

    2026年3月15日
    11

发表回复

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

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