java程序里的四舍五入,Java中的四舍五入

Math类中有这样两个方法:

1publicstaticlonground(doublea)

2publicstaticintround(floata)

方法1返回最接近参数的long,其结果相当于下面这个表达式的值:

(long)Math.floor(a+ 0.5d)

方法2返回最接近参数的int,其结果相当于下面这个表达式的值:

(int)Math.floor(a + 0.5f)

这其实就是四舍五入了,只不过它们只保留整数位。

示例:

longaL = Math.round(0.4d);

longbL = Math.round(0.5d);

intcI = Math.round(0.4f);

intdI = Math.round(0.5f);

System.out.println("aL = "+ aL);

System.out.println("bL = "+ bL);

System.out.println("cI = "+ cI);

System.out.println("dI = "+ dI);

输出结果:

aL = 0

bL = 1

cI = 0

dI = 1

下面,我们利用方法1返来实现自己的四舍五入方法,使它对不同的精度提供支持。

publicstaticdoublemyRound(doubled,intn) {

// 分别以A:d = 0.514d, n = 1和B:d = 0.514d, n = 2为例进行分析

d = d * Math.pow(10, n);

// A: 0.514 * 10 -> 5.14

// B: 0.514 * 100 -> 51.4

d += 0.5d;

// A: 5.14 + 0.5 -> 5.64

// B: 51.4 + 0.5 -> 51.9

d = (long)d;

// A: (long)5.64 -> 5

// B: (long)51.9 -> 51

d = d / Math.pow(10d, n);

// A: 5 / 10d -> 0.5

// B: 51 / 100d -> 0.51

returnd;

// 合起来写

// return (long)(d * Math.pow(10d, n) + 0.5d) / Math.pow(10d, n);

}

下面对这个方法进行测试:

System.out.println("myRound(916.254, -3) = "+myRound(916.254, -3));

System.out.println("myRound(916.254, -2) = "+myRound(916.254, -2));

System.out.println("myRound(916.254, -1) = "+myRound(916.254, -1));

System.out.println("myRound(916.254, 0) = "+myRound(916.254, 0));

System.out.println("myRound(916.254, 1) = "+myRound(916.254, 1));

System.out.println("myRound(916.254, 2) = "+myRound(916.254, 2));

System.out.println("myRound(916.254, 3) = "+myRound(916.254, 3));

输出结果:

myRound(916.254, -3) = 1000.0

myRound(916.254, -2) = 900.0

myRound(916.254, -1) = 920.0

myRound(916.254, 0) = 916.0

myRound(916.254, 1) = 916.3

myRound(916.254, 2) = 916.25

myRound(916.254, 3) = 916.254

我们的目标基本上实现了。但是,仔细观察,当n <= 0的时候,打印出来的结果不是我们想要的那样,小数点后的那个0是没有意义的。这是因为myRound方法返回的值是double类型。重要的是数据,格式是第二位的。如果要对数据的输出格式进行比较精确的控制,可以使用PrintStream类的这个方法:

publicPrintStream printf(String format, Object... args)

从方法名printf就可以猜出它和C的printf函数之间的关系。

如果想让920.0显示为920,可以这样写:

System.out.printf("%.0f", 920.0);

但如果想让920.5显示为920,用上面的方法是不行的。

System.out.printf("%.0f", 920.5);

这条语句会输出921,而不是920。

其实,Java类库已经提供了四舍五入的方法,只不过比较隐蔽,当然它的功能也更强大。在java.math包中有一个BigDecimal类,这个类有这样一个方法:

publicBigDecimal divide(BigDecimal divisor,

intscale,

RoundingMode roundingMode)

这个方法其实是做大数的除法,其中的divisor就是除数,要做四舍五入,我们为divisor传入newBigDecimal(1),scale就是商的标度(精度),如果我们要保留两位小数,就为scale传入2,roundingMode是舍入模式,除四舍五入以外,Java还提供了好几种其它的舍入模式,而我们要做四舍五入,为它传入RoundingMode.HALF_UP。

示例:

System.out.println(newBigDecimal(916.254).divide(newBigDecimal(1), -3, RoundingMode.HALF_UP));

System.out.println(newBigDecimal(916.254).divide(newBigDecimal(1), -2, RoundingMode.HALF_UP));

System.out.println(newBigDecimal(916.254).divide(newBigDecimal(1), -1, RoundingMode.HALF_UP));

System.out.println(newBigDecimal(916.254).divide(newBigDecimal(1), -0, RoundingMode.HALF_UP));

System.out.println(newBigDecimal(916.254).divide(newBigDecimal(1), 1, RoundingMode.HALF_UP));

System.out.println(newBigDecimal(916.254).divide(newBigDecimal(1), 2, RoundingMode.HALF_UP));

System.out.println(newBigDecimal(916.254).divide(newBigDecimal(1), 3, RoundingMode.HALF_UP));

输出结果:

1E+3

9E+2

9.2E+2

916

916.3

916.25

916.254

需要注意的是,这个方法返回的是一个bigDecimal对象,要把它转成double或int,使用下面的方法:

publicdoubledoubleValue()

publicintintValue()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值