Java踩坑之大整数类

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);

下面介绍几种常用的模式

  1. RoundingMode.UP表示向远离0的方向保留
  2. RoundingMode.DOWN表示向着靠近0的方向保留
  3. RoundingMode.CEILING表示向着正无穷大的方向保留
  4. RoundingMode.FLOOR表示向着负无穷大的方向保留
  5. RoundingMode.HALF_UP表示向着数字的方向保留,可以理解为四舍五入
    大概就是这样,不过还有一个问题是,我们要是输出的时候要保留几位小数的问题,系统自带的函数也可以解决
System.out.println(result.setScale(p,BigDecimal.ROUND_HALF_UP));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值