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);
}

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

posted @ 2020-05-06 17:15  Bluto  阅读(306)  评论(0编辑  收藏  举报