Java 为什么我';我得到了不同的大小数舍入结果?

Java 为什么我';我得到了不同的大小数舍入结果?,java,rounding,Java,Rounding,为什么我会得到以下输出: 1.11 1.13 当运行以下代码时: public static void main(String[] args) { double aDouble = 1.115; double bDouble = 1.125; System.out.println(roundTo2Decimal(aDouble)); System.out.println(roundTo2Decimal(bDouble)); } public static B

为什么我会得到以下输出:

1.11

1.13

当运行以下代码时:

public static void main(String[] args) {

    double aDouble = 1.115;
    double bDouble = 1.125;

    System.out.println(roundTo2Decimal(aDouble));
    System.out.println(roundTo2Decimal(bDouble));
}

public static BigDecimal roundTo2Decimal(double doubleToRound){
    BigDecimal bigDecimal = new BigDecimal(doubleToRound);
    return bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
}
而不是预期的结果:

1.12


1.13?

可以肯定,这只是标准的浮点不精确性。0.125=1/8,可精确表示为二进制。0.115不是这样的,所以它并没有被准确地存储,而且,很明显,它被存储为与您期望的不同的东西。请尝试
System.out.println
双精度本身。

可以肯定这只是标准的浮点不精确性。0.125=1/8,可精确表示为二进制。0.115不是这样的,所以它并没有被准确地存储,而且,很明显,它被存储为与您期望的不同的东西。尝试
System.out.println
double本身。

这是由于将1.115表示为double时的精度损失造成的:

1.115 = 1.114999999999999991118215803E0
1.125 = 1.125E0

这是由于将1.115表示为双精度时的精度损失造成的:

1.115 = 1.114999999999999991118215803E0
1.125 = 1.125E0

谢谢我发现了一些关于fp不准确的信息:谢谢。我发现了一些关于fp不准确的信息:这里的一般教训是,如果你曾经关心过十进制数字,你甚至不应该碰
double
。这里的一般教训是,如果你曾经关心过十进制数字,你甚至不应该碰
double
。尽管这可能会给作者提供所需的结果,它没有回答被问到的问题,可能应该是一个注释-例如:“不要使用
BigDecimal.ROUND_HALF_UP
,而是使用
RoundingMode.天花
”。但是对于1.11400和1.12400,我需要相应的1.11和1.12。RoundingMode.天花不会给出这些结果。虽然这可能会为作者提供所需的结果,但它不会回答所问的问题,可能应该是一个注释-例如:“不要使用
BigDecimal.ROUND\u HALF\u UP
,使用
RoundingMode.天花
”.但对于1.11400和1.12400,我需要相应的1.11和1.12。RoundingMode.天花板不提供这些结果。