首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大整数和双转换

大整数和双转换
EN

Stack Overflow用户
提问于 2020-01-02 00:35:52
回答 2查看 821关注 0票数 0

我正在尝试下面的计算。

代码语言:javascript
复制
 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?它总是提示我使用数据类型double。

我尝试将k转换成大整数,如下所示

代码语言:javascript
复制
    BigInteger t = BigDecimal.valueOf(k).toBigInteger();

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-02 01:13:51

因为Java就是这样设计的。方法Math.pow()返回double。这就是为什么表达式中所有乘法和加法的结果也是double。所以表达式的结果是double。这就是为什么您只能直接将它赋值给一个类型为double的变量。

您还可以对其进行强制转换,并将其分配给其他基本类型的变量,如floatlong。但是对于BigInteger,没有原始类型,您不能转换它。相反,您必须显式创建一个类型为BigInteger的变量。

在当前的表达式形式中,如果使用更大的数字,即当数字包含超过16位小数时,可以松掉一些最后的数字。这就是我建议您在此类表达式的所有部分使用BigInteger的原因,如下所示:

代码语言:javascript
复制
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)对于大整数都有类似的语法。

票数 1
EN

Stack Overflow用户

发布于 2020-01-02 02:02:20

为了简化语句,可以利用较短的constant值以及定义自己的值,在本例中是ten。这可以减少使用BigInteger的一些麻烦,也可以减少错误的可能性。因为BigInteger是一个不可变的类,所以ten不会更改它的值。

代码语言:javascript
复制
        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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59557244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档