• Math.ceil 笔记


    Math


    Math.ceil

    主要是聊一聊Math.ceil() 这个函数,众所周知这个函数是向上取整时用到的,最常用的场景是数据库分页查询,手动拼写sql(offset, limit)时用到。

    然而这个函数返回的double类型的,在使用的时候还要进行一次强转int,用起来很是费劲。

    为什么Java要强转,JS却不用?

    写JS的时候前端分页,一直用的lodash的_.ceil(),也不记得有强转呀。 后来用代码跑了一遍

    typeof Math.ceil(11) =>"number"
    

    恍然大悟:

    JS里是没有int,double,float这些类型的,这些类型统称为Number

    MDN上说:

    In JavaScript , Number is a numeric data type in the double-precision 64-bit floating point format (IEEE 754) . In other programming languages different numeric types exist; for example, Integers, Floats, Doubles, or Bignums.

    为什么Java要返回double类型的,而不是int类型的?

    看下函数签名

    接受的是个double类型的参数,如果返回int就会出问题,因为两者表示的数据范围不一致。

    来个测试

    @Test
    void test5() {
        final double maxDouble = Double.MAX_VALUE;
        final int maxInt = Integer.MAX_VALUE;
    
        final int intResult = (int)Math.ceil(maxDouble);
        assertEquals(maxInt, intResult);
    
        final double doubleResult = Math.ceil(maxDouble);
        assertEquals(maxDouble, doubleResult);
    }
    

    测试是绿的。

    这就解释了为啥Math.ceil()返回double了。

    另外一个有意思的现象

    看测试

    @Test
    void test6() {
        final double doubleResult = Math.ceil(100L/11);
        assertEquals(10D, doubleResult);
    }
    

    然测试挂了。。。返回的是居然是9.0.

    一步一步剖析一下

    提取个变量就找到问题了,常见的问题,一不小心就会出问题。。。

    @Test
    void test6() {
        final double result = 100L / 11D;
        final double doubleResult = Math.ceil(result);
        assertEquals(10D, doubleResult);
    }
    

    稍微改一下,测试又绿了。

  • 相关阅读:
    第三周学习笔记
    质量属性
    第四周学习
    逻辑回归
    架构的概念
    第二周总结
    线性回归
    十步走-阅读笔记六
    十步走-阅读笔记五
    P2633 Count on a tree
  • 原文地址:https://www.cnblogs.com/qulianqing/p/12837590.html
Copyright © 2020-2023  润新知