floor(double d)返回值double,rint(double d),round(double d)和round(float f)。


    但是,其中和四舍五入相近的方法只有rint和round方法,如果单独使用这两个方法的话,所得到的结果和我们预期的结果不一样,

    比如round(-1.5)所得到的结果是-1,而不是我们预期的-2;

    而rint(-1.5)得到的结果是-2.0,但是rint(2.5)得到的结果却是2.0,和我们预期的3.0也不一样

int java 取下取整 java向下取整int_round方法

int java 取下取整 java向下取整int_round方法_02

    我们分析一下为什么会这样子,首先看一下round方法的API:


Returns the result of rounding the argument to an integer. The result is equivalent to (long) Math.floor(d+0.5).

Special cases:

    • round(+0.0) = +0.0
    • round(-0.0) = +0.0
    • round((anything > Long.MAX_VALUE) = Long.MAX_VALUE
    • round((anything < Long.MIN_VALUE) = Long.MIN_VALUE
    • round(+infinity) = Long.MAX_VALUE
    • round(-infinity) = Long.MIN_VALUE
    • round(NaN) = +0.0



    Parameters

    d

    the value to be rounded.



    Returns



    • the closest integer to the argument.


    即返回一个和参数相近的整型,其结果相当于(long) Math.floor(d+0.5)的值,对于Math.floor(double d)方法,其结果是d向下取整,所以对于round(-1.5)来说,它的返回值是要加上0.5再向下取整,也就是-1.5+0.5=-1.0,1.0向下取整还是1.0,所以返回的是长整型1,但是计算正数的时候就没有这个问题。比如说round(1.5),计算的就是(long)(1.5+0.5)=(long)2.0=2L,所以对于round方法来说对于负数四舍五入所得到的结果是不正确的。


        然后我们来看一下rint方法的API,这个方法与四舍五入差的有点远。


    public static double rint (double d)


    Added in API level 1


    Returns the double conversion of the result of rounding the argument to an integer. Tie breaks are rounded towards even.

    Special cases:

    • rint(+0.0) = +0.0
    • rint(-0.0) = -0.0
    • rint(+infinity) = +infinity
    • rint(-infinity) = -infinity
    • rint(NaN) = NaN


    Parameters

    d

    the value to be rounded.


    Returns
    • the closest integer to the argument (as a double).



        这个方法也是返回一个和参数相近的整型,当有两个整数的时候,会返回偶数的那个。

    也就是说,当遇到几点五的时候,才会遇到两个整数,所以对于rint(-1.5)来说,会有-1.0和-2.0两个整数与-1.5相近,但是他会取偶数-2.0,。对于rint(-1.3)只有一个整数-1.0与-1.3接近,所以此时不会有误差。但是对于rint(2.5),有2.0和3.0与2.5接近,他会返回与我们预期不一样的偶数2.0,rint(-2.5)会返回-2.0,所以对于rint方法,当遇到偶数点五的时候,结果会不一样。

    综合上述,如果想用round方法就得解决负数问题,所以可以用绝对值Math.abs方法来解决。下面为代码:

    方法一:

    public double run(double num){
        double a=Math.signum(num); //判断是正数负数还是0,负数返回-1.0,正数返回1.0
        if(a<0.0)
            return 0.0-Math.round(Math.abs(num));
        return Math.round(num);
    }

    如果想用rint方法就得解决偶数点五的问题,下面为代码:

    方法二:


    public double run(double num){
       if(Math.floor(Math.abs(num))%2!=0)
           return Math.rint(num);
       if(five(num))
           if(Math.signum(num)<0.0)
           return Math.rint(num)-1.0;
       else if(Math.signum(num)>0.0)
           return Math.rint(num)+1.0;
       return Math.rint(num);
    
    }
    public boolean five(double n){
        String[] split = String.valueOf(n).split("\\.");
        if(split[1].startsWith("5"))
            return true;
        else return false;
    }



    当然也有其他方法,比如用保留小数的方法string的格式化方法都行   

    因为方法二效率低,所以建议使用方法一。

    本人第一次写博客,还是学生,所以有不足之处请指正,请谅解不足或错误之处,谢谢!