BigDecimal.valueOf(float)如何工作?

时间:2016-05-29 06:14:44

标签: java floating-point

我已经看过this asnwer

我对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

这肯定不是我预期的行为。有没有办法让round up正确地浮动以避免此类错误?

1 个答案:

答案 0 :(得分:4)

有关 float 的说明以及它如何利用分配的位,请参阅 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