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