zoukankan      html  css  js  c++  java
  • 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);
    }
    

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

  • 相关阅读:
    数据结构杂谈(三)堆排序
    数据结构杂谈(二)简单有趣的地精排序Gnome sort
    搭建proftp服务器
    python 单例模式
    mongo
    kafka
    查看端口占用
    tinyproxy 代理使用
    Linux 搭建wiki
    linux 安装 java
  • 原文地址:https://www.cnblogs.com/qulianqing/p/12837590.html
Copyright © 2011-2022 走看看