【问题标题】:How to compare BigInteger with double如何将 BigInteger 与 double 进行比较
【发布时间】:2015-10-20 00:59:17
【问题描述】:

在我的程序中,我想将 bigInteger 与 double 进行比较。我在网上搜索了很多,但它不能正常工作。有人请帮助我。或者请推荐好的链接。

【问题讨论】:

  • "显示一些错误?"什么错误? :)
  • 我确实发布了答案,但@Satya 是对的;一些代码呢?并说出你想要达到的目标......
  • 错误:二元运算符“
  • 不在评论中。编辑您的问题,发布您的完整代码。

标签: java collections double biginteger


【解决方案1】:

BigInteger 实现了Number,而Number 具有.doubleValue()。因此,您可以做的是:

final int cmp = Double.compare(theBigInt.doubleValue(), myDouble);
// work with cmp

(当然,BigInteger 具有无限精度的问题仍然存在,这与 double 不同;但您已经意识到这一点,对吧?)

【讨论】:

  • 为什么更喜欢 double 作为比较类型,而不是避免舍入错误的 BigDecimal?
  • @PatriciaShanahan 不知道,我什至不知道 OP 真正想要实现什么(没有用户场景),但我同意BigDecimal 从长远来看更安全。但是,没有关于用例的有用信息,我只是粗略地回答了...
【解决方案2】:

您必须将这两个值都转换为 BigDecimal,然后才能进行比较:

    BigInteger bi = new BigInteger("1");
    BigDecimal db = new BigDecimal(bi);
    db.compareTo(new BigDecimal(1.3d));

【讨论】:

  • +1(但我不能这么说)BigDecimal 是用于比较的正确类型,因为两种转换都是精确的。
【解决方案3】:

这个答案是对 existing answer 的扩展,说明了为什么 BigDecimal 而不是 double 是用于比较 BigInteger 和 double 的正确常用类型。

在下面的程序中,biPowerPlusOne 明显大于 biPower。使用 double 进行比较,它们都被认为等于 dPower。另一方面,使用 BigDecimal 进行比较正确显示 biPower 等于 dPower,但 biPowerPlusOne 大于 dPower。

原因是 2**100+1 在 BigInteger 和 BigDecimal 中完全可以表示,但在双算术中四舍五入为 2**100(使用 ** 表示求幂)

import java.math.BigDecimal;
import java.math.BigInteger;

public class Test {

  public static void main(String[] args) {
    double dPower = Math.pow(2, 100);
    BigInteger biPower = BigInteger.ONE.shiftLeft(100);
    BigInteger biPowerPlusOne = biPower.add(BigInteger.ONE);
    System.out.println("biPowerPlusOne.compareTo(biPower)="
        + biPowerPlusOne.compareTo(biPower));
    compareBoth(biPower, dPower);
    compareBoth(biPowerPlusOne, dPower);
  }

  private static void compareBoth(BigInteger bi, double d) {
    System.out.println("Comparing: " + bi + " to " + d);
    System.out.println("crossCompareDouble: " + crossCompareDouble(bi, d));
    System.out
        .println("crossCompareBigDecimal: " + crossCompareBigDecimal(bi, d));
  }

  private static int crossCompareDouble(BigInteger bi, double d) {
    return Double.compare(bi.doubleValue(), d);
  }

  private static int crossCompareBigDecimal(BigInteger bi, double d) {
    BigDecimal bd1 = new BigDecimal(bi);
    BigDecimal bd2 = new BigDecimal(d);
    return bd1.compareTo(bd2);
  }
}

输出:

biPowerPlusOne.compareTo(biPower)=1
Comparing: 1267650600228229401496703205376 to 1.2676506002282294E30
crossCompareDouble: 0
crossCompareBigDecimal: 0
Comparing: 1267650600228229401496703205377 to 1.2676506002282294E30
crossCompareDouble: 0
crossCompareBigDecimal: 1

【讨论】:

    猜你喜欢
    • 2015-10-29
    • 2012-12-20
    • 1970-01-01
    • 2012-10-29
    • 2015-08-06
    • 1970-01-01
    • 2022-01-02
    • 2013-04-05
    • 2013-11-20
    相关资源
    最近更新 更多