如何比较两个大小数

cod*_*rix 1 java bigdecimal

我有以下代码,但是我无法理解为什么两个bigdecimal不被视为相等

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        BigDecimal b = new BigDecimal(13.90);
        BigDecimal b2 = new BigDecimal("13.9");
        System.out.println(b.compareTo(b2));
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码输出1作为输出.那为什么会这样?不应该是0吗?

此外,如果我写13.9而不是"13.9",它给出0作为输出

M. *_*tte 5

因为你假设如果你使用13.9它将完全是13.9.尝试打印的价值观bb2,你会看到,13.9实际上是13.9000000000000003552713678800500929355621337890625和分析的字符串值 13.9.所以b(稍微)高于b2.

public static void main(String...strings) {
            BigDecimal b = new BigDecimal(13.9);
            BigDecimal b2 = new BigDecimal("13.9");
            System.out.printf("%s %s %d%n", b, b2, b.compareTo(b2));
}
Run Code Online (Sandbox Code Playgroud)

作为输出:

13.9000000000000003552713678800500929355621337890625 13.9 1
Run Code Online (Sandbox Code Playgroud)

关于浮点数学的主题,您可能想要阅读为什么浮点数不准确?和stackoverflow上可用的其他链接.

  • @codeomnitrix显然他们将是不同的构造函数.BigDecimal具有无限精度,使用String构建一个可以构建具有无限精度的任何值.所以它显然会.另一方面,采用浮点值作为参数的构造函数无法对该浮点值进行任何操作. (3认同)
  • 它不是很奇怪的实现,它是你必须在二进制机制中编码浮点时得到的限制.这是计算机的限制.你需要某种形式的舍入/截断来决定它们是否相同,或者去"BigDecimal-with-string-constructor"complety,因为`BigDecimal`的实现不会遇到这个问题(afaik). (2认同)