Java8中的RoundingMode.HALF_DOWN问题

我正在使用jdk

1.8.0_45,我们的测试发现了路由中的错误。当决定舍入的最后一个小数为5时,RoundingMode.HALF_DOWN与RoundingMode.HALF_UP相同。

我发现了RoundingMode.HALF_UP的相关问题,但已在更新40中修复。我也向oracle放了一个bug,但根据我的经验,它们确实没有响应。

package testjava8;

import java.math.RoundingMode;

import java.text.DecimalFormat;

public class Formatori {

public static void main(String[] args) {

DecimalFormat format = new DecimalFormat("#,##0.0000");

format.setRoundingMode(RoundingMode.HALF_DOWN);

Double toFormat = 10.55555;

System.out.println("Round down");

System.out.println(format.format(toFormat));

format.setRoundingMode(RoundingMode.HALF_UP);

toFormat = 10.55555;

System.out.println("Round up");

System.out.println(format.format(toFormat));

}

}

实际结果:舍入10.5556舍入10.5556

预期结果(使用jdk 1.7获得):向下舍入10.5555向上舍入10.5556

回答:

似乎是有意更改。JDK 1.7行为不正确。

问题是您根本

无法10.55555使用double类型来表示数字。它以IEEE二进制格式存储数据,因此,当您10.55555double变量分配十进制数时,实际上会获得可以用IEEE格式表示的最接近的值:10.555550000000000210320649784989655017852783203125。此数字大于10.55555,因此10.5556HALF_DOWN模式下正确舍入为。

您可以检查一些可以用二进制精确表示的数字。例如,10.15625(为10 +

5/32,因此1010.00101为二进制)。这个数字四舍五入到10.1562HALF_DOWN模式,10.1563HALF_UP模式。

如果要恢复旧的行为,可以先将数字转换为BigDecimalusing

BigDecimal.valueOf构造函数,该构造函数“ 使用’的规范字符串表示形式将a double转换为a ”:BigDecimal``double

BigDecimal toFormat = BigDecimal.valueOf(10.55555);

System.out.println("Round down");

System.out.println(format.format(toFormat)); // 10.5555

format.setRoundingMode(RoundingMode.HALF_UP);

toFormat = BigDecimal.valueOf(10.55555);

System.out.println("Round up");

System.out.println(format.format(toFormat)); // 10.5556

以上是 Java8中的RoundingMode.HALF_DOWN问题 的全部内容, 来源链接: utcz.com/qa/427332.html

回到顶部