我发现舍入不一致DecimalFormat http://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.htmljava 7 和 java 8 之间的类。这是我的测试用例:
DecimalFormatTest.java
import java.text.DecimalFormat;
public class DecimalFormatTest {
public static void main(String[] args) {
DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance();
format.setDecimalSeparatorAlwaysShown(true);
format.setMinimumFractionDigits(1);
format.setMaximumFractionDigits(1);
System.out.println(format.format(83.65));
}
}
在 Java(TM) SE 运行时环境(版本 1.7.0_51-b13)中,输出为:
83.6
在 Java(TM) SE 运行时环境(版本 1.8.0-b132)中,输出为:
83.7
这是回归错误吗?或者舍入规则是否随着 Java 8 的发布而改变?
看起来这是 JDK 7 中长期存在的错误,最终得到修复。参见示例:
- https://bugs.openjdk.java.net/browse/JDK-8029896 https://bugs.openjdk.java.net/browse/JDK-8029896
- https://bugs.openjdk.java.net/browse/JDK-7131459 https://bugs.openjdk.java.net/browse/JDK-7131459
有一个计划草案为 JDK 8 提供以下咨询,解释了该问题:
-------------------------------------------------- ------------------- 区域:核心库/java.text
Synopsis: JDK7 的错误舍入行为已得到修复。这
NumberFormat/DecimalFormat format() 方法的舍入行为有
当价值非常接近平局时发生变化
格式模式中指定的舍入位置。
不兼容的性质: 行为的
描述:使用 NumberFormat/DecimalFormat 类时,
以前的 JDK 版本的舍入行为在某些方面是错误的
案例。调用 format() 方法时发生此错误行为
非常接近平局的值,同时指定舍入位置
使用的 NumberFormat/DecimalFormat 实例的模式是
正好坐在领带的位置。在这种情况下,错误的双
发生了舍入或错误的非舍入行为。
例如,使用默认推荐时NumberFormatFormat
应用程序编程接口
形式:NumberFormat nf = java.text.NumberFormat.getInstance()
已关注
经过nf.format(0.8055d)
, value 0.8055d
在计算机中记录为0.80549999999999999378275106209912337362766265869140625
因为该值无法以二进制格式精确表示。这里默认
舍入规则为“半偶数”,调用 format() 的结果为
JDK7错误输出为“0.806”,而正确结果为“0.805”
因为计算机在内存中记录的值“低于”领带。
这种新行为也适用于所有舍入位置
这可能是由程序员选择的任何模式定义的(非
默认的)。
射频E7131459
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)