首页 > 其他 > 详细

Math.ceil 笔记

时间:2020-05-06 22:55:55      阅读:64      评论:0      收藏:0      [点我收藏+]

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

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

Math.ceil 笔记

原文:https://www.cnblogs.com/qulianqing/p/12837590.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!