2016-05-29 19 views
1

我已经看过this asnwerBigDecimal.valueOf(float)如何工作?

我对BigDecimal.valueOf(float)的行为有些困惑。这里的例子:

System.out.println(BigDecimal.valueOf(20.2f)); //prints 20.200000762939453 

因此

float f = BigDecimal.valueOf(20.2f) 
      .setScale(2, RoundingMode.UP) 
      .floatValue(); 
System.out.println(f); //prints 20.21 

哪个defenitely不是我所期望的行为。是否有一种方法可以正确地避免这种错误?

+0

看看(http://stackoverflow.com/questions/588004/is-floating-point-math- [是浮点运算坏了吗?]破碎)。有限精度浮点数固有地不能表示某些值。它与基数10中的1/3无法完全相同。这里'20.2f!= 20.2'。 – Zong

+0

@宗正立很有意思。所以我们处理浮点算术,并且希望保持精确的精度,我们是否应该在我们对它们执行算术运算时执行ROUND_EVEN? – stella

+0

预期产量是多少?它看起来是正确的,20.200000762939453四舍五入到小数点后两位是20.21。您可以尝试将比例设置为更大的数字,然后将其设置为2 – samgak

回答

4

对于浮动的描述,以及如何利用分配的位看 How many significant digits have floats and doubles in java?

BigDecimal的正常工作和 - 预期 - 保持它收到的所有数字,但它不能猜测的精度给定的论点。因此:

float f = 20.20f; 
    System.out.println("Float: "+f); 
    System.out.println("BigDecimal.valueOf: "+BigDecimal.valueOf(f)); 
    System.out.println("BigDecimal from value: "+new BigDecimal(f, MathContext.DECIMAL32)); 
    System.out.println("BigDecimal from string: "+new BigDecimal(""+f));; 

打印:

Float: 20.2 
BigDecimal.valueOf: 20.200000762939453 
BigDecimal from value: 20.20000 
BigDecimal from string: 20.2