为什么BigDecimal不像我预期的那样工作?

pet*_*ton -1 java

这是注释中的代码和结果:

我认为numB2应该是16.7500,numB3 = 16.7500,numB4 = 16.7和numB5 = 16.75.但它们并不像我预期的那样.为什么?

public void testBigDecimal()
{
    float num = 16.7499924f;

    int digitCount = 4;
    MathContext mContext = new MathContext(digitCount, RoundingMode.UP);
    BigDecimal numB = new BigDecimal(num, mContext);
    System.out.println("16.7499924f with MathContext(precision) of 4 =" + numB.floatValue());// 16.75
    numB.setScale(4, RoundingMode.UP);
    System.out
            .println("16.7499924f with MathContext(precision) of 4 and after setScale of 4 =" + numB.floatValue());// 16.75

    BigDecimal numB2 = new BigDecimal(num);
    System.out.println("16.7499924f without MathContext(precision =" + numB2.floatValue());// 16.749992
    numB2.setScale(4, RoundingMode.UP);
    System.out.println("16.7499924f without MathContext(precision) and after setScale of 4 =" + numB2.floatValue());// 16.749992

    BigDecimal numB3 = new BigDecimal(num);
    numB3.setScale(4, RoundingMode.UP);
    System.out.println("16.7499924f without MathContext(precision) but with setScale of 4 =" + numB3.floatValue());// 16.749992

    BigDecimal numB4 = new BigDecimal(num);
    numB4.setScale(1, RoundingMode.UP);
    System.out.println("16.7499924f without MathContext(precision) but with setScale of 1 =" + numB4.floatValue());// 16.749992

    BigDecimal numB5 = new BigDecimal(num);
    numB5.setScale(2, RoundingMode.UP);
    System.out.println("16.7499924f without MathContext(precision) but with setScale of 2 =" + numB5.floatValue());// 16.749992

}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 5

BigDecimal是不可变的.你忽略了setScale()的结果.所以你所拥有的基本上都是noops.

另外,使用字符串来创建BigDecimal.并且不要将其打印为浮点值.在这样做时你会失去精确度,这首先是使用BigDecimal的重点:

String num = "16.7499924";

int digitCount = 4;
MathContext mContext = new MathContext(digitCount, RoundingMode.UP);
BigDecimal numB = new BigDecimal(num, mContext);
System.out.println("16.7499924f with MathContext(precision) of 4 =" + numB.toPlainString());
numB = numB.setScale(4, RoundingMode.UP);
System.out.println("16.7499924f with MathContext(precision) of 4 and after setScale of 4 =" + numB.toPlainString());
Run Code Online (Sandbox Code Playgroud)