在对某个数取整的时候,我们通常会想到Math类,然而有很多方法同样可以达到目的却被忽略了。下面就让我们把这些方法都理一理,可能会对你有所帮助。

方法一:Math

这个类型的很多方法与取整有关,如:

round() rint() ceil() floor()

然而这四个函数的取整规则却大不相同,请看下面的例子:

double a = 177.4;
double b = 178.5;
double c = 179.6;

System.out.println("example 1: number is " + a);
System.out.println("Math.round(" + a + ") = " + Math.round(a));
System.out.println("Math.rint(" + a + ") = " + Math.rint(a));
System.out.println("Math.ceil(" + a + ") = " + Math.ceil(a));
System.out.println("Math.floor(" + a + ") = " + Math.floor(a));
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

System.out.println("example 2: number is " + b);
System.out.println("Math.round(" + b + ") = " + Math.round(b));
System.out.println("Math.rint(" + b + ") = " + Math.rint(b));
System.out.println("Math.ceil(" + b + ") = " + Math.ceil(b));
System.out.println("Math.floor(" + b + ") = " + Math.floor(b));
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

System.out.println("example 3: number is " + c);
System.out.println("Math.round(" + c + ") = " + Math.round(c));
System.out.println("Math.rint(" + c + ") = " + Math.rint(c));
System.out.println("Math.ceil(" + c + ") = " + Math.ceil(c));
System.out.println("Math.floor(" + c + ") = " + Math.floor(c));

打印结果如下:

example 1: number is 177.4
Math.round(177.4) = 177
Math.rint(177.4) = 177.0
Math.ceil(177.4) = 178.0
Math.floor(177.4) = 177.0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
example 2: number is 178.5
Math.round(178.5) = 179
Math.rint(178.5) = 178.0
Math.ceil(178.5) = 179.0
Math.floor(178.5) = 178.0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
example 3: number is 179.6
Math.round(179.6) = 180
Math.rint(179.6) = 180.0
Math.ceil(179.6) = 180.0
Math.floor(179.6) = 179.0

从结果分析可以得到以下几条规律:
round()方法得到的结果是四舍五入的,保留整数,其他的三个方法都保留了一位小数。
floor()方法得到的结果是不进位的,保留一位小数,且为0。
ceil()方法得到的结果是有数(>0) 必进位,保留一位小数,且为0。
rint()方法得到的结果是四舍五入的,但是当一个数与它最接近的两个整数的差值相同时 (如:12.5),它会取其中的偶数值,用的时候千万要注意。

方法二:NumberFormat

顾名思义,这个类就是用来处理数字的。这个类提供了一个format方法,可以达到取整的目的。示例代码如下:


NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(0);
nf.setMinimumFractionDigits(0);
double a = 177.1;
double b = 178.5;
double c = 179.6;

System.out.println("example 1: number is " + a);
System.out.println(nf.format(a));

System.out.println("example 2: number is " + b);
System.out.println(nf.format(b));

System.out.println("example 3: number is " + c);
System.out.println(nf.format(c));

打印结果如下:
example 1: number is 177.1
177
example 2: number is 178.5
178
example 3: number is 179.6
180

从结果分析得知,这个方法与Math的rint()方法非常类似,不同的是它的结果只保留整数。

方法三:DecimalFormat

DecimalFormat是NumberFormat的子类,因此它们的用法基本相同,取整的规则也一致。除了在获取实例的时候有所不同而已。

方法四:BigDecimal

这个类也非常常用,一般用来处理高精度的数学运算。用这个类来取整,似乎是大材小用,但是不管白猫黑猫,抓到老鼠的都是好猫。先看代码:


System.out.println(new BigDecimal(a).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue());
System.out.println(new BigDecimal(b).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue());
System.out.println(new BigDecimal(c).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue());

打印结果如下:
177.0
179.0
180.0

相信大家看了代码之后也就看到了真相了吧。就不多解释了。

方法五:String

这个方法倒是不常用,但是它是一个非常好用的方法,建议掌握。请看示例代码:

double c = 5.6;
System.out.println(String.format("%1$5.0f", c));

打印结果为: 6

“%1$5.0f”: %1表示第一个参数,$5.0f表示小数点前保留五位,不足五位补空格。小数点后保留0位小数,f表示浮点数。只能用来格式化float和double类型的数。

笔者目前收集到这些方法,如果你知道有更好的方法,请不吝赐教。由于本人水平有限,文章中存在不足或错误之处在所难免,希望各位批评指正!

原创文章,转载请注明出处!

本Blog文章除特别声明之外皆为原创文章,欢迎转载,转载请注明: 转载自JSSAY'S BLOG

本文链接地址: http://www.jssay.com/blog/index.php/2010/08/31/jdk%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b9%8b%e5%8f%96%e6%95%b4%e5%87%bd%e6%95%b0/


随机日志

标签:, ,

发表评论