Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,如何将两个大整数除法,并将值存储在一个double中?_Java - Fatal编程技术网

在java中,如何将两个大整数除法,并将值存储在一个double中?

在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

所以我试着除以两个大整数22和7。换句话说,我正试图将
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。