Java 为什么我';我得到了不同的大小数舍入结果?
为什么我会得到以下输出: 1.11 1.13 当运行以下代码时: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
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.天花板不提供这些结果。