Java 7 和 Java 8 之间的舍入不一致是一个错误吗?

2024-03-17

我发现舍入不一致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(使用前将#替换为@)

Java 7 和 Java 8 之间的舍入不一致是一个错误吗? 的相关文章

随机推荐

  • Gmail删除链接标签,如何避免这种情况

    我正在尝试使用函数 mail 发送包含链接的富文本 我正在发送这种代码 Please access a href http www site md contact en Contact a to send all these informa
  • 从 SQL 脚本在 H2 数据库中插入长文本

    我正在尝试使用 H2 的 runscript 运行 sql 脚本 其中一个表包含一个长文本类型 用于存储 xml 文档 来自 SAP 数据库 因此 Insert 语句包含较长的 XML 文本 大约 200 行 XML 这相当难看 但仍然可以
  • 如何让 2 个 div 继承父 div 中具有更高高度的 div 的高度?

    我在匹配父 div 内 2 个 div 的高度时遇到问题 我很难解释我是在 Jsfiddle 上做的 http jsfiddle net DSQpd http jsfiddle net DSQpd 基本上 我想做的是匹配高度 无论哪一个更长
  • 将字符串拆分为单词并与其他数据重新连接

    我有一个使用的方法Regex寻找文本中的模式string 它可以工作 但不足以继续下去 因为它需要文本出现在确切的顺序 而不是将短语视为一组单词 public static string HighlightExceptV1 this str
  • 使用 python 将数据从 xml 文件填充到 sqlite 数据库

    我有一个与解决问题的一些指南相关的问题 我有一个 xml 文件 我必须使用脚本语言将其填充到数据库系统 无论如何 它可能是 sqlite mysql 中 Python 有人知道如何继续吗 我需要进一步阅读哪些技术 我必须安装哪些环境 有关于
  • CFWheels网站根目录的不同重写模式

    我需要关于研究以下问题的建议 车轮网站有set URLRewriting On 配置完毕 除了根页面之外 一切看起来都很好 所有链接均使用linkTo看起来像website tld controller action 但是在 模式下 切换
  • WeakHashMap 是否会不断增长,或者是否会清除垃圾键?

    我正在尝试使用WeakHashMap https docs oracle com javase 10 docs api java util WeakHashMap html作为并发Set https docs oracle com java
  • 如何从 Visual Studio 解决方案中获取所有界面类型?

    我正在尝试编写 Visual Studio 的扩展 我需要获取当前打开的所有项目中找到的所有接口类型的列表solution 到目前为止 我已经尝试使用 EnvDev 命名空间来执行此操作 有没有办法在不解析项目的 cs 文件的情况下执行此操
  • 为什么记录类型定义中不允许使用灵活类型?

    我正在尝试这个 type TS1 lt state action gt actions state gt seq lt action gt move state gt action gt state state0 state 但类型检查器不
  • JobIntentService 和 IntentService 有什么区别?

    我不明白这两个 API 之间有什么区别 我的意思是何时使用第一个 为什么会有 JobIntentService 提前致谢 我建议阅读这篇文章 解释两者之间的区别意向服务和求职意向服务 https medium com hupareshubh
  • 如何设置休眠sql_mode

    有没有办法在 Hibernate 属性或连接字符串中设置 sql mode 对于 MySql 数据库 Thanks Stefano Yes as 有记录的 https dev mysql com doc connector j 5 1 en
  • .htaccess 重定向文件夹

    All 我想重定向所有访问的流量http 我的网站 http mysite to http mysite public http mysite public文件夹 目前我正在 htaccess 文件中使用以下内容来执行此操作 它适用于根目录
  • 在python中读取.dat文件

    我有一个 dat 文件 我不知道它是如何创建的 使用了什么分隔符以及有关它的任何详细信息 我只有相应的 mdf 和 csv 文件 就这样 python 有什么方法可以读取这个 dat 文件吗 我尝试过的几种方法 file 736 2 Per
  • Bash 中的 Echo 换行符打印文字 \n

    如何打印换行符 这仅仅打印 n echo e Hello nWorld Hello nWorld Use printf反而 printf hello nworld n printf在不同环境下的行为比echo
  • 我可以在 mongodb 的 $match 聚合函数中使用 $in 吗

    我试图在 match 聚合 函数中使用 in 运算符 由于某种原因 它不适用于 Id 字段 但我找不到任何文档指出 mongodb 不支持此功能 var ids 1 2 3 4 an example I am using real mong
  • Django 聚合:仅求和返回值?

    我有一个已付价值列表 并想显示已付总额 我已经使用了聚合和Sum一起计算值 问题是 我只想打印出总值 但聚合打印出 amount sum 480 0 480 0 为总增加值 在我看来 我有 from django db models imp
  • Kafka 一个分区有多个消费者

    我有一个将消息写入主题 分区的生产者 为了保持顺序 我想使用单个分区 并且我希望 12 个消费者读取该单个分区中的所有消息 没有消费者组 所有消息都应该发送给所有消费者 这是可以实现的吗 我读过一些论坛 每个分区只有一个消费者可以阅读 您可
  • 查找最长可能重复字符串的实用程序

    是否有任何工具或实用程序或 perl python 脚本可以在大型文本文件中找到最长的重复子字符串并打印这些模式以及每个模式出现的次数 http en wikipedia org wiki Longest repeated substrin
  • 如何从某个数字/偏移量开始自动增量?

    我正在运行 fgetcsv 查询以将一堆数据从 CSV 导入 WordPress 我想知道如何从某个数字开始自动递增 例如从 1000 开始 import1 INSERT into wp postmeta meta id post id m
  • Java 7 和 Java 8 之间的舍入不一致是一个错误吗?

    我发现舍入不一致DecimalFormat http docs oracle com javase 8 docs api java text DecimalFormat htmljava 7 和 java 8 之间的类 这是我的测试用例 D