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));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章