BigDecimal.valueOf(float) 如何工作?

ste*_*lla 2 java floating-point

我已经看过这个答案了

的行为让我有点困惑BigDecimal.valueOf(float)。这是示例:

System.out.println(BigDecimal.valueOf(20.2f)); //prints 20.200000762939453
Run Code Online (Sandbox Code Playgroud)

所以

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

这绝对不是我预期的行为。有没有办法round up正确浮动避免此类错误?

And*_*nko 5

有关浮点数及其如何利用分配的位的描述,请参阅 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));;
Run Code Online (Sandbox Code Playgroud)

印刷:

Float: 20.2
BigDecimal.valueOf: 20.200000762939453
BigDecimal from value: 20.20000
BigDecimal from string: 20.2
Run Code Online (Sandbox Code Playgroud)