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;                                                    
}     
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • gnuplot 入门教程 1

    gnuplot 入门教程 1几年前写的一篇短文,今天找东西时翻出来了,感觉写的还是比较实用的。放在这里供有需要的人参考。现在在网上可以找的科学作图软件有不少,其中不乏优秀者,Win平台上有大名鼎鼎的Origin、Tecplot、SigmaPlot等,类UNIX上有LabPlot、gnuplot等。其他的常见的计算软件如Matlab、Mathematica、Maple、Scilab、IDL、Maxima等也都对科学作图

  • Java学习资源整理

    Java学习资源整理好书推荐《JAVA编程思想》《JAVA核心技术卷1》《EffectiveJava》《Java并发编程的艺术》《深入理解Java虚拟机》《MySQL必知必会》网络协议,入门可以读《图解HTTP》、《图解TCP/IP》,如果要深入研究可以读《UNIX网络编程卷1》和《TCP/IP详解卷1》Servlet系列教材(一)-基础-教程:开发第一个Servlet-how2j.cn…

  • 系统分析师零散知识点「建议收藏」

    系统分析师零散知识点「建议收藏」数据库连接池技术是指在系统初期或者初次使用时,完成数据库的连接,以后不再释放此连接,在处理后面的请求时,反复使用这些已经建立的连接。这种方式可以大大减少数据库的处理时间,有利于提高系统的整体性能、可测量性和扩展性。应用服务器的高速缓存?在应用服务器中有页面的缓存和数据库的缓存。页面的缓存是指将特定的URL对应的页面在缓存中予以记录,以便在

  • vue使用axios解决跨域_vue前端解决跨域的方法

    vue使用axios解决跨域_vue前端解决跨域的方法工具版本:【vue-V】:2.9.6ide工具:VSCode/Idea前提:我们前端vue工程需要单独部署一、本地使用命令运行跨域问题。外网访问的地址:https://www.runoob.com/try/ajax/json_demo.json本地springboot接口访问的地址:http://192.168.3.12:8081/register/getSmsCode/1234567891、axios访问的代码: created(){ const_this=this

  • HTTP请求错误400、401、402、403、404、405、406、407、412、414、500、501、502解析

    HTTP请求错误400、401、402、403、404、405、406、407、412、414、500、501、502解析

    2021年10月12日
  • 「旅游信息管理系统」 · Java Swing + MySQL 开发「建议收藏」

    「旅游信息管理系统」 · Java Swing + MySQL 开发「建议收藏」代码写得烂,写博客纯属记录!微信公众号:BugLass码云仓库地址:https://gitee.com/ynavc/tourism_sys源代码及文档打包下载:https://download.csdn.net/download/weixin_44893902/12819432目录一、需求简介:业务流程及系统概念模型如下:游客:业务管理员:旅游业务模型:整体概要设计:二、界面示例:首页:点击报名:如果没有登录提示游客登录登录界面:注册界面:..

发表回复

您的电子邮箱地址不会被公开。

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