代码之家  ›  专栏  ›  技术社区  ›  Roman

为什么bigdecimal(“5.50”)不等于bigdecimal(“5.5”),如何解决这个问题?

  •  45
  • Roman  · 技术社区  · 14 年前

    实际上,我已经找到了可能的解决办法

    //returns true
    new BigDecimal("5.50").doubleValue() == new BigDecimal("5.5").doubleValue()
    

    当然,它可以通过以下方式加以改进 Math.abs (v1 - v2) < EPS 为了使比较更加有力,但问题是这种技术是否可以接受,或者是否有更好的解决方案?

    如果有人知道为什么Java设计者决定用这种方式实现BigDigMals的相等,那么阅读会很有趣。

    3 回复  |  直到 6 年前
        1
  •  79
  •   Colin Hebert    14 年前

    public boolean equals(Object x)

    BigDecimal Object compareTo

    compareTo() == 0

        2
  •  8
  •   Community CDub    7 年前

    == seems like a bad idea

    new BigDecimal ("5.50").setScale(2).equals(new BigDecimal("5.5").setScale (2))
    

    BigDecimal a1 = new BigDecimal("5.051");
    BigDecimal b1 = new BigDecimal("5.05");
    // wow, this is awkward in Java
    int maxScale = Collections.max(new ArrayList() {{ a1.scale(), b1.scale()}});
    System.out.println(
      a1.setScale(maxScale).equals(b1.setScale(maxScale)) 
      ? "are equal" 
      : "are different" );
    

    compareTo() == 0

    /**
     * Version of compareTo that ignores sign.
     */
    private int compareMagnitude(BigDecimal val) {
        // Match scales, avoid unnecessary inflation
        long ys = val.intCompact;
        long xs = this.intCompact;
    

    compareTo

        3
  •  4
  •   user1708042    9 年前

    bd1.stripTrailingZeros().equals(bd2.stripTrailingZeros())