大整数和双转换

问题描述 投票:-1回答:2

我正在尝试以下计算。

 double k = 2015 * Math.pow(10, 10) + 12 * Math.pow(10, 8) + 25 * Math.pow(10, 6)
                + 12 * Math.pow(10, 4) + 30 * Math.pow(10, 2) + 59 + 1;

为什么Java不允许我将此数字另存为Big Integer?它总是提示我使用数据类型double。

我尝试如下将k转换为Big Integer

    BigInteger t = BigDecimal.valueOf(k).toBigInteger();

我的[[k值为2.015122512306E13]”转换后,我的大整数t的值为20151225123060

java types double biginteger
2个回答
0
投票
因为Java是按这种方式设计的。方法Math.pow()返回double。这就是为什么表达式中所有乘法和加法的结果也是double的原因。因此,表达式的结果为double。这就是为什么您只能直接将其分配给double类型的变量的原因。

您还可以将其强制转换并分配给其他

primitive

类型的变量,例如floatlong。但是对于BigInteger,没有原始类型,因此无法强制转换。相反,您必须显式创建BigInteger类型的变量。]​​>在当前表达式形式中,如果使用更大的数字,则可以松散一些最后的数字,即当数字由16个以上的十进制数字组成时。这就是为什么我建议您在此类表达式的所有部分中使用BigInteger的原因,如下所示:

BigInteger k = BigInteger.valueOf(2015).multiply(BigInteger.valueOf(10).pow(10)) .add(BigInteger.valueOf(12).multiply(BigInteger.valueOf(10).pow(8))) .add(BigInteger.valueOf(25).multiply(BigInteger.valueOf(10).pow(6))) .add(BigInteger.valueOf(12).multiply(BigInteger.valueOf(10).pow(4))) .add(BigInteger.valueOf(30).multiply(BigInteger.valueOf(10).pow(2))) .add(BigInteger.valueOf(59)) .add(BigInteger.valueOf(1));

这种表达可能看起来很复杂。在这种情况下,请检查您是否真的需要BigInteger。如果确实需要,您必须接受

任意

精度整数的价格。或者,考虑使用其他平台而不是Java,但是其中许多平台(例如R,Python)对于大整数具有相似的语法。
为了简化语句,您可以利用较短的constant值以及定义自己的值(在这种情况下为ten)。这样可以减少使用BigInteger的麻烦,并减少出错的可能性。由于BigInteger是不可变的类,因此ten不会更改其值。

BigInteger ten = BigInteger.TEN; // Constant defined in BigInteger BigInteger k = BigInteger.valueOf(2015).multiply(ten.pow(10)) .add(BigInteger.valueOf(12).multiply(ten.pow(8))) .add(BigInteger.valueOf(25).multiply(ten.pow(6))) .add(BigInteger.valueOf(12).multiply(ten.pow(4))) .add(BigInteger.valueOf(30).multiply(ten.pow(2))) .add(BigInteger.valueOf(59)) .add(BigInteger.ONE); // Constant defined in BigInteger System.out.println(k);


0
投票
为了简化语句,您可以利用较短的constant值以及定义自己的值(在这种情况下为ten)。这样可以减少使用BigInteger的麻烦,并减少出错的可能性。由于BigInteger是不可变的类,因此ten不会更改其值。
© www.soinside.com 2019 - 2024. All rights reserved.