如何比较两个大小数

时间:2018-05-26 18:12:19

标签: 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));
    }
}

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

如果我写13.9而不是" 13.9"它给0输出

3 个答案:

答案 0 :(得分: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));
}

作为输出:

13.9000000000000003552713678800500929355621337890625 13.9 1

关于浮点数学的主题,您可能需要阅读Why Are Floating Point Numbers Inaccurate?以及stackoverflow上可用的其他链接。

答案 1 :(得分:3)

浮点数值不准确,它们是近似值。因此,当您键入文字值13.90时,保留的实际值不是精确到13.90,而是尽可能接近它。

BigDecimal值是精确的,而字符串只是字符串。

因此,当您使用新的BigDecimal(13.90)和新的BigDecimal(" 13.9")时,第一个保存一个值,该值恰好是传递给它的浮点值,这是非常接近,但与13.9不同。第二个包含13.9。

其中一个是13.9而另一个是接近但不等于13.9。所以这两个对象并不等于。

答案 2 :(得分:1)

双重音符的BigDecimal构造函数的enter image description here,结果“可能有些不可预测”。那是因为输入的十进制值实际上是浮点近似值。通常,使用BigDecimal String构造函数构造十进制值是一种好习惯。但是,如果您不能或不能这样做,您可以随时设置比例和舍入。下面的代码将为您提供所寻求的结果。

BigDecimal b = new BigDecimal(13.90).setScale(2,BigDecimal.ROUND_HALF_UP);
BigDecimal b2 = new BigDecimal("13.9");
System.out.println(b.compareTo(b2));

注意:舍入发生在比例结束时。因此,使用一组2,值13.900004将舍入到13.90。