大整数和双重转换
Big Integer and Double Conversion
我正在尝试下面的计算。
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 不允许我将这个数字保存为大整数?它总是提示我使用双精度数据类型。
我尝试如下将 k 转换为大整数
BigInteger t = BigDecimal.valueOf(k).toBigInteger();
我的 k 值是 2.015122512306E13 转换后,我的大整数 t 有值 20151225123060 。
因为Java就是这样设计的。方法 Math.pow()
return double
。这就是为什么表达式中所有乘法和加法的结果也是 double
。所以表达式的结果是double
。这就是为什么你只能直接将它分配给 double
.
类型的变量的原因
您还可以转换它并将其分配给其他 原始 类型的变量,例如 float
或 long
。但是对于 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
是不可变的 class,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);
我正在尝试下面的计算。
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 不允许我将这个数字保存为大整数?它总是提示我使用双精度数据类型。
我尝试如下将 k 转换为大整数
BigInteger t = BigDecimal.valueOf(k).toBigInteger();
我的 k 值是 2.015122512306E13 转换后,我的大整数 t 有值 20151225123060 。
因为Java就是这样设计的。方法 Math.pow()
return double
。这就是为什么表达式中所有乘法和加法的结果也是 double
。所以表达式的结果是double
。这就是为什么你只能直接将它分配给 double
.
您还可以转换它并将其分配给其他 原始 类型的变量,例如 float
或 long
。但是对于 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
是不可变的 class,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);