簡體   English   中英

在Java中,如何將兩個BigIntegers相除並將值存儲為double?

[英]In java, how do I divide two BigIntegers and store the value in a double?

因此,我嘗試將兩個BigIntegers 22和7 b1.divide(b2)換句話說,我嘗試存儲b1.divide(b2)的前幾位小數[其中b1 = new BigInteger("22")b2 = new BigInteger("7") ]轉換為某種數據類型。 但是,如果我使用BigDecimal ,它將顯示一個無法表示的數字錯誤,即使它不能用於雙精度數。 我該怎么辦? 為了您的方便,以下是代碼:

BigInteger b1 = new BigInteger("22");
BigInteger b2 = new BigInteger("7");
BigInteger b3 = b1.divide(b2);
System.out.println(b3);

這就是控制台中顯示的內容:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decima
l expansion; no exact representable decimal result.
    at java.math.BigDecimal.divide(Unknown Source)
    at Divider.main(Divider.java:13)

使用BigInteger.divide(...)將僅提供BigInteger ,因此,如果直接使用此方法,則會降低輸出的精度。 以下是一些解決方案。

解決方案1(使用BigInteger ):

    BigInteger b1 = new BigInteger("22");
    BigInteger b2 = new BigInteger("7");
    double d = b1.doubleValue() / b2.doubleValue();
    System.out.println(d);

解決方案2(使用BigDecimal ,已經定義的精度)

    BigDecimal b1 = new BigDecimal("22");
    BigDecimal b2 = new BigDecimal("7");
    BigDecimal b3 = b1.divide(b2, MathContext.DECIMAL32);
    System.out.println(b3);

解決方案3(使用BigDecimal ,自我控制的精度)

參考Jason Hoetger提供的解決方案

BigInteger.divide()返回一個BigInteger,因此,除非實際上是一個整數,否則您將無法獲得BigInteger.divide()的任何結果的“前幾位小數”。

如果b1b2絕對必須是BigIntegers,則可以從BigInteger創建BigDecimal,然后使用BigDecimal.divide()。 您需要指定結果的小數位數以控制小數位數,並需要MathContext來確定如何舍入答案。 例如:

BigInteger b1 = new BigInteger("22");
BigInteger b2 = new BigInteger("7");
BigDecimal quotient = new BigDecimal(b1)
    .divide(new BigDecimal(b2), 3, RoundingMode.HALF_EVEN);
System.out.println(quotient);

結果是:

3.143

BigInteger的除法方法返回一個BigInteger,其值為{@code(this / val)}。Y

假設您確實在使用BigDecimal (而不是BigInteger ): BigDecimal旨在以浮點不能提供的方式提供精確的十進制值。 但是,當除以22/7時,它具有重復的小數,因此不能在BigDecimal按原樣表示。

在這種情況下,您需要指定要舍入的小數位數以及舍入方式(向上,向下或最接近)。 因此,要舍入到小數點后三位,您將需要:

BigDecimal b3 = b1.divide(b2, 3, RoundingMode.HALF_EVEN);

您在BigDecimal中看到的錯誤在這里得到了很好的解釋: ArithmeticException:“非終止十進制擴展;沒有確切可表示的十進制結果”

通過增加精度並四舍五入,可以解決該問題。 a.divide(b,2,RoundingMode.HALF_UP)其中2是精度,而RoundingMode.HALF_UP是舍入模式。 https://docs.oracle.com/javase/7/docs/api/java/math/RoundingMode.html

您當前使用BigIntegers編寫的代碼可在Java7上運行。

並將結果保存為BigDecimal和BigInteger的兩倍:

double b4 = b1.divide(b2,2).doubleValue();
double b4 = b1.divide(b2).doubleValue();

因此,BigDecimal:

BigDecimal b1 = new BigDecimal("22");
BigDecimal b2 = new BigDecimal("7");
BigDecimal b3 = b1.divide(b2,2,RoundingMode.HALF_UP);
double b4 = b1.divide(b2,2).doubleValue();
double b5 = b1.divide(b2,2,RoundingMode.HALF_UP).doubleValue();

BigInteger:

 BigInteger b1 = new BigInteger("22");
 BigInteger b2 = new BigInteger("7");
 BigInteger b3 = b1.divide(b2);
 double b4 = b1.divide(b2).doubleValue();

由於大整數被認為是對大的數字,不使用雙(也許它太大了,64位的空間......),而不是使用BigDecimal,它可以在構造一個BigInteger太:

BigDecimal b3 = new BigDecimal("22").divide(new BigDecimal("7"), 3, RoundingMode.HALF_EVEN);

System.out.println(b3);

這是獲得雙重價值的方法,

BigInteger b1 = new BigInteger("22");
BigInteger b2 = new BigInteger("7");
double b3 = b1.divide(b2).doubleValue();
System.out.println(b3);

如果我對您的理解正確,那么您正在嘗試將BigInteger b1除以b2並將其存儲在BigInteger中。 但是,兩個整數的商是一個整數。

3.14286(四舍五入)不是整數。

您可以改用BigDecimal

BigInteger b1 = new BigInteger("22");
BigInteger b2 = new BigInteger("7");
BigDecimal b3 = new BigDecimal(b1.divide((double)b2));
System.out.println(b3);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM