详解Java中Math.round()的取整规则

做Java的面试题时遇到了以下这题,百度了一下Math.round()的修约规则,有的说是四舍五入,有的说是四舍六入,发现和我学分析化学时用的数字修约规则(四舍六入五成双)很像,所以验证一下;
原题:Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
作者给的解题方法如下:

答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。

先说结论,题目作者给的解释是对的,后来找了该方法的定义,结果方法的定义就是这个原理,果然看文档才是王道;

round方法:

static long round(double a)
此方法返回的参数最接近的long.

static int round(float a)
此方法返回的参数最接近的整数.

注:四舍六入五成双:

当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”这里“四”是指≤4 时舍去,”六”是指≥6时进上,”五”指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:①5前为奇数,舍5入1;②5前为偶数,舍5不进。(0是偶数)

以下只论证static int round(float a)

    //四舍
    int[] test1 = {
        Math.round(2.40f),
        Math.round(2.44f),
        Math.round(2.45f),
        Math.round(2.46f),
        Math.round(-2.40f),
        Math.round(-2.44f),
        Math.round(-2.45f),
        Math.round(-2.46f),
        Math.round(3.40f),
        Math.round(3.44f),
        Math.round(3.45f),
        Math.round(3.46f),
        Math.round(-3.40f),
        Math.round(-3.44f),
        Math.round(-3.45f),
        Math.round(-3.46f)};
    for(int i = 0; i< test1.length; i++)
    {
      System.out.print(test1[i]+",");
    }
    //输出:2,2,2,2,-2,-2,-2,-2,3,3,3,3,-3,-3,-3,-3,符合四舍;也符合 加0.5,进行下取整;

    //六入
    int[] test2 = {
        Math.round(2.60f),
        Math.round(2.64f),
        Math.round(2.65f),
        Math.round(2.66f),
        Math.round(-2.60f),
        Math.round(-2.64f),
        Math.round(-2.65f),
        Math.round(-2.66f),
        Math.round(3.60f),
        Math.round(3.64f),
        Math.round(3.65f),
        Math.round(3.66f),
        Math.round(-3.60f),
        Math.round(-3.64f),
        Math.round(-3.65f),
        Math.round(-3.66f)};
    for(int i = 0; i< test2.length; i++)
    {
      System.out.print(test2[i]+",");
    }
    //输出:3,3,3,3,-3,-3,-3,-3,4,4,4,4,-4,-4,-4,-4,符合六入;也符合 加0.5,进行下取整;

    //五成双之五后无数字
    int[] test3 = {
        Math.round(2.5f),
        Math.round(-2.5f),
        Math.round(3.5f),
        Math.round(-3.5f)};
    for(int i = 0; i< test3.length; i++)
    {
      System.out.print(test3[i]+",");
    }
    //输出:3,-2,4,-3,不符合五成双;符合 加0.5,进行下取整;

    //五成双之五后有数字(零,非零)
    int[] test4 = {
        Math.round(2.50f),
        Math.round(2.51f),
        Math.round(2.59f),
        Math.round(-2.50f),
        Math.round(-2.51f),
        Math.round(-2.59f),
        Math.round(3.50f),
        Math.round(3.51f),
        Math.round(3.59f),
        Math.round(-3.50f),
        Math.round(-3.51f),
        Math.round(-3.59f),
    };
    for(int i = 0; i< test4.length; i++)
    {
      System.out.print(test4[i]+",");
    }
    //输出:3,3,3,-2,-3,-3,4,4,4,-3,-4,-4,不符合五后非零进一;符合 加0.5,进行下取整;

    //结论:Math.round()的取整规则不符合四舍六入五成双,以上案例符合 加0.5,进行下取整;

到此这篇关于详解Java中Math.round()的取整规则的文章就介绍到这了,更多相关Java Math.round()取整 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解

    首先还是看看JavaScript: The Definitive Guide, 4th Edition中对三个函数的定义. Math.ceil(): round a number up Arguments: Any numeric value or expression Returns: The closest integer greater than or equal to x. ---------------------------------------------------------

  • 详解Java中Math.round()的取整规则

    做Java的面试题时遇到了以下这题,百度了一下Math.round()的修约规则,有的说是四舍五入,有的说是四舍六入,发现和我学分析化学时用的数字修约规则(四舍六入五成双)很像,所以验证一下: 原题:Math.round(11.5) 等于多少?Math.round(-11.5)等于多少? 作者给的解题方法如下: 答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11.四舍五入的原理是在参数上加0.5然后进行下取整. 先说结论,题目作者给的解释是对的

  • 详解Java中的延时队列 DelayQueue

    当用户超时未支付时,给用户发提醒消息.另一种场景是,超时未付款,订单自动取消.通常,订单创建的时候可以向延迟队列种插入一条消息,到时间自动执行.其实,也可以用临时表,把这些未支付的订单放到一个临时表中,或者Redis,然后定时任务去扫描.这里我们用延时队列来做.RocketMQ有延时队列,RibbitMQ也可以实现,Java自带的也有延时队列,接下来就回顾一下各种队列. Queue 队列是一种集合.除了基本的集合操作以外,队列还提供了额外的插入.提取和检查操作.队列的每个方法都以两种形式存在:一

  • 详解Java中的HashTable

    概论 HashTable是遗留类,很多映射的常用功能与HashMap类似,不同的是它承自Dictionary类,并且是线程安全的,并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁. Hashtable不建议在新代码中使用,不需要线程安全的场合可以用HashMap替换,需要线程安全的场合可以用ConcurrentHashMap替换. 对比HashMap 的初始容量 默认11 的初始容量 需要注意的是Hashtable的默认初始容量大小是11,而Has

  • 详解Java中Checked Exception与Runtime Exception 的区别

    详解Java中Checked Exception与Runtime Exception 的区别 Java里有个很重要的特色是Exception ,也就是说允许程序产生例外状况.而在学Java 的时候,我们也只知道Exception 的写法,却未必真能了解不同种类的Exception 的区别. 首先,您应该知道的是Java 提供了两种Exception 的模式,一种是执行的时候所产生的Exception (Runtime Exception),另外一种则是受控制的Exception (Checked

  • 详解Java中AbstractMap抽象类

    jdk1.8.0_144 下载地址:http://www.jb51.net/softs/551512.html AbstractMap抽象类实现了一些简单且通用的方法,本身并不难.但在这个抽象类中有两个方法非常值得关注,keySet和values方法源码的实现可以说是教科书式的典范. 抽象类通常作为一种骨架实现,为各自子类实现公共的方法.上一篇我们讲解了Map接口,此篇对AbstractMap抽象类进行剖析研究. Java中Map类型的数据结构有相当多,AbstractMap作为它们的骨架实现实

  • 详解java中的阻塞队列

    阻塞队列简介 阻塞队列(BlockingQueue)首先是一个支持先进先出的队列,与普通的队列完全相同: 其次是一个支持阻塞操作的队列,即: 当队列满时,会阻塞执行插入操作的线程,直到队列不满. 当队列为空时,会阻塞执行获取操作的线程,直到队列不为空. 阻塞队列用在多线程的场景下,因此阻塞队列使用了锁机制来保证同步,这里使用的可重入锁: 而对于阻塞与唤醒机制则有与锁绑定的Condition实现 应用场景:生产者消费者模式 java中的阻塞队列 java中的阻塞队列根据容量可以分为有界队列和无界队

  • 详解java中的static关键字

    Java中的static关键字可以用于修饰变量.方法.代码块和类,还可以与import关键字联合使用,使用的方式不同赋予了static关键字不同的作用,且在开发中使用广泛,这里做一下深入了解. 静态资源(静态变量与静态方法) 被static关键字修饰的变量和方法统一属于类的静态资源,是类实例之间共享的.被static关键字修饰的变量.方法属于类变量.类方法,可以通过[类名.变量名].[类名.方法名]直接引用,而不需要派生一个类实例出来. 静态资源分类存放的好处 JDK把不同的静态资源放在了不同的

  • 详解JAVA中priorityqueue的具体使用

    Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示.本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度,将让读者建立对PriorityQueue建立清晰而深入的认识. 总体介绍 前面以JavaArrayDeque为例讲解了Stack和Queue,其实还有一种特殊的队列叫做PriorityQueue,即优先队列.优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,

  • 详解java中BigDecimal精度问题

    一.背景 在实际开发中,对于 不需要任何准确计算精度的属性可以直接使用float或double,但是如果需要精确计算结果,则必须使用BigDecimal,例如价格.质量. 为什么这么说,主要有两点 1.double计算会有精度丢失问题 2.在除法运算时,BigDecimal提供了丰富的取舍规则.(double虽然可以通过NumberFormat进行四舍五入,但是NumberFormat是线程不安全的) 对于精度问题我们可以看下实际的例子 public static void main(Strin

  • 详解Java中String类的各种用法

    目录 一.创建字符串 二.字符.字节与字符串的转换 1.字符与字符串的转换 2.字节与字符串的转换 三.字符串的比较 1.字符串常量池 2.字符串内容比较 四.字符串查找 五.字符串替换 六.字符串拆分 七.字符串截取 八.String类中其它的常用方法 九.StringBuffer 和 StringBuilder 1.StringBuilder与StringBuffer的区别 2.StringBuilder与StringBuffer常用的方法 十.对字符串引用的理解 一.创建字符串 创建字符串

随机推荐