在java中,如何将两个大整数除法,并将值存储在一个double中?
所以我试着除以两个大整数22和7。换句话说,我正试图将在java中,如何将两个大整数除法,并将值存储在一个double中?,java,Java,所以我试着除以两个大整数22和7。换句话说,我正试图将b1.的前几位小数除以(b2)[其中b1=new biginger(“22”),以及b2=new biginger(“7”)]存储到某个数据类型中。但是,如果我使用一个BigDecimal,它会显示一个不可再现的数字错误,而它甚至不适用于双精度。我该怎么办?为方便起见,以下是代码: BigInteger b1 = new BigInteger("22"); BigInteger b2 = new BigInteger("7"); BigInt
b1.的前几位小数除以(b2)
[其中b1=new biginger(“22”)
,以及b2=new biginger(“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)
由于大整数被认为是用于大数字不要使用double(可能它对于64位空间来说太大了…),而是使用BigDecimal,它也可以在构造函数中接受一个BigInteger:
BigDecimal b3 = new BigDecimal("22").divide(new BigDecimal("7"), 3, RoundingMode.HALF_EVEN);
系统输出打印LN(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=新的BigInteger(“22”);
BigInteger b2=新的BigInteger(“7”);
BigDecimal b3=新的BigDecimal(b1.除法((双)b2));
系统输出打印LN(b3);
BigInteger的divide方法返回一个值为{@code(this/val)}.Y使用BigInteger。divide(…)
将只给出BigInteger
,因此如果直接使用此方法,将失去输出的精度。下面是一些解决方案
解决方案1(使用biginger
):
BigInteger b1 = new BigInteger("22");
BigInteger b2 = new BigInteger("7");
double d = b1.doubleValue() / b2.doubleValue();
System.out.println(d);
解决方案2(使用BigDecimal
,已定义精度)
解决方案3(使用大十进制
,自动控制精度)
参考Jason Hoetger给出的解决方案,假设您确实在使用
BigDecimal
(而不是BigInteger
):一个BigDecimal
意味着以浮点所不能的方式提供精确的十进制值。但是,当除以22/7时,它有一个重复的小数,因此不能用BigDecimal
表示
在这种情况下,您需要指定要舍入的小数位数以及舍入方式(向上、向下或最近)。因此,要四舍五入到小数点后三位,您需要:
BigDecimal b3 = b1.divide(b2, 3, RoundingMode.HALF_EVEN);
BigInteger.divide()返回一个BigInteger,因此您无法获得BigInteger.divide()的任何结果的“前几位小数”,除非它实际上是一个整数
如果b1
和b2
绝对必须是BigInteger,则可以从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
您看到的BigDecimal错误在这里得到了很好的解释: 通过增加精度和四舍五入,问题可以得到解决。 a、 除法(b,2,四舍五入模式。半向上) 其中2为精度和舍入模式。半向上为舍入模式。 当前带有大整数的代码在Java7上工作 并将结果保存为BigDecimal和BigInteger的双精度:
double b4 = b1.divide(b2,2).doubleValue();
double b4 = b1.divide(b2).doubleValue();
BigInteger b1 = new BigInteger("22");
BigInteger b2 = new BigInteger("7");
BigInteger b3 = b1.divide(b2);
double b4 = b1.divide(b2).doubleValue();
所以,
大十进制:
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();
大整数:
double b4 = b1.divide(b2,2).doubleValue();
double b4 = b1.divide(b2).doubleValue();
BigInteger b1 = new BigInteger("22");
BigInteger b2 = new BigInteger("7");
BigInteger b3 = b1.divide(b2);
double b4 = b1.divide(b2).doubleValue();
为什么不使用BigDecimal?您的代码正在使用Java7。您的代码示例仅显示
BigInteger
对象。。。但是你的异常跟踪引用了BigDecimal
,所以有些事情你没有告诉我们。你给出的代码使用的是biginger
,而你提到的异常显示的是BigDecimal
,这意味着异常属于其他代码,而不是发布的代码。我很抱歉,伙计们。我的意思是BigDecimal b3
,而不是biginger b3
。很抱歉给你们带来这么多麻烦。谢谢你回答我的问题。它将截断小数点。它输出3
,而它应该是3.14285…
。请接受一个最适合您要求的答案。为什么要麻烦首先使用BigInteger?@ScaryWombat在这个精心设计的示例中,它没有多大意义,但在更现实的情况下,您可能别无选择,例如,如果BigInteger来自另一个API.compile错误,则类型BigInteger中的方法divide(BigInteger)不适用于参数(double),如果b2
远大于b1
,b1.doubleValue()/b2.doubleValue()
将比在将结果转换为双精度之前对大整数进行除法(以理解大整数除法的方式)更快返回0。