[英]How do i divide BigIntegers in kotlin? (I have tried div() and divideAndRemainder())
[英]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()的任何結果的“前幾位小數”。
如果b1
和b2
絕對必須是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.