Java踩坑之大整数类
今天做了一个题目,让使用大整数进行简单的运算,结果在世把我按在地上摩擦,看来自己还是太菜了
起初的思路是,将每种包子的总数除以吃包子的速度,得到三个时间,然后把三个时间加起来就行,然鹅看了一眼数据规模以后果断使用BigDecimal,但是第一个坑就出现了,这里会出一个bug
package com.shunping.vip;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;
public class 猴子吃包子 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int y = sc.nextInt();
int z = sc.nextInt();
int x1 = sc.nextInt();
int y1 = sc.nextInt();
int z1 = sc.nextInt();
int p = sc.nextInt();
BigDecimal v11 = new BigDecimal(x);
BigDecimal v22 = new BigDecimal(y);
BigDecimal v33 = new BigDecimal(z);
BigDecimal x11 = new BigDecimal(x1);
BigDecimal y11 = new BigDecimal(y1);
BigDecimal z11 = new BigDecimal(z1);
BigDecimal result = x11.divide(v11);
result = result.add(y11.divide(v22));
result = result.add(z11.divide(v33));
System.out.println(result.setScale(p,BigDecimal.ROUND_HALF_UP));
}
}
当使用数据
5 7 8 20 80 30 2
我们会出现一个异常
后来查出来的结果是因为,使用大整数类进行除法时,结果是一个无限不循环小数,造成的这个问题,那么我们的解决方案,也很简单,那就是在除法运行时指定结果的位数,这个问题有点小,但是以前一直没注意,现在想想确实有些恐怖
在大整数类的除法那个方法中,可以直接指定结果的小数点后保留几位,并且可以设置保留方式
BigDecimal result = x11.divide(v11,p+5,RoundingMode.HALF_UP);
下面介绍几种常用的模式
- RoundingMode.UP表示向远离0的方向保留
- RoundingMode.DOWN表示向着靠近0的方向保留
- RoundingMode.CEILING表示向着正无穷大的方向保留
- RoundingMode.FLOOR表示向着负无穷大的方向保留
- RoundingMode.HALF_UP表示向着数字的方向保留,可以理解为四舍五入
大概就是这样,不过还有一个问题是,我们要是输出的时候要保留几位小数的问题,系统自带的函数也可以解决
System.out.println(result.setScale(p,BigDecimal.ROUND_HALF_UP));