我有以下代码,但是我无法理解为什么这两个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输出
答案 0 :(得分:5)
因为你假设如果使用13.9,它将完全是13.9。尝试打印b
和b2
的值,您会看到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构造函数的,结果“可能有些不可预测”。那是因为输入的十进制值实际上是浮点近似值。通常,使用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。