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.55555
为double
变量分配十进制数时,实际上会获得可以用IEEE格式表示的最接近的值:10.555550000000000210320649784989655017852783203125
。此数字大于10.55555
,因此10.5556
在HALF_DOWN
模式下正确舍入为。
您可以检查一些可以用二进制精确表示的数字。例如,10.15625
(为10 +
5/32,因此1010.00101
为二进制)。这个数字四舍五入到10.1562
的HALF_DOWN
模式,10.1563
在HALF_UP
模式。
如果要恢复旧的行为,可以先将数字转换为BigDecimal
using
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