不可预测的双重[重复]

2024-01-07

可能的重复:
.NET 上的双精度问题 https://stackoverflow.com/questions/566958/double-precision-problems-on-net
双重计算产生奇数结果 https://stackoverflow.com/questions/8253789/double-calculation-producing-odd-result

我知道双精度值的内部表示0.2是这样的0.199999。但下面的代码仍然让我困惑。

CODE:

public static void main(String[] args) {
    double d= 0.3d;
    double f= 0.1d;
    System.out.println(d+f);
    System.out.println(d*f);
    System.out.println(d);
    System.out.println(f);
    System.out.println(d-f);
    System.out.println(d/f);
    System.out.println((d-f)*(d-f));
}

OUTPUT:

0.4
0.03
0.3
0.1
0.19999999999999998
2.9999999999999996
0.039999999999999994

究竟发生了什么?加法、乘法可以进行,但减法、除法则不行。谁能详细说明一下为什么加法与减法的效果不同 ?


如果您迫切需要精度,请使用 BigDecimal。

public static void main(String[] args) {
    BigDecimal d = BigDecimal.valueOf(0.3d);
    BigDecimal f = BigDecimal.valueOf(0.1d);
    System.out.println(d.add(f));
    System.out.println(d.multiply(f));
    System.out.println(d);
    System.out.println(f);
    System.out.println(d.subtract(f));
    System.out.println(d.divide(f));
    System.out.println((d.subtract(f)).multiply(d.subtract(f)));
}

Output

0.4
0.03
0.3
0.1
0.2
3
0.04

或者对结果进行四舍五入,DecimalFormat 会使用 # 符号很好地完成此操作,这意味着仅在必要时显示小数

    double d = 0.3d;
    double f = 0.1d;
    DecimalFormat format = new DecimalFormat("#.##");
    System.out.println(format.format(d + f));
    System.out.println(format.format(d * f));
    System.out.println(format.format(d));
    System.out.println(format.format(f));
    System.out.println(format.format(d - f));
    System.out.println(format.format(d / f));
    System.out.println(format.format((d - f) * (d - f)));

Output

0.4
0.03
0.3
0.1
0.2
3
0.04
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不可预测的双重[重复] 的相关文章

随机推荐

  • 为什么 Cortex-A 的复位处理程序位于 0x0 而 Cortex-M3 则不然

    Cortex M3 的初始堆栈指针值位于 0x0 复位处理程序位于 0x4 原因是什么 这样做的设计理由是什么 为什么 ARM 人员不能像 Cortex A 那样将 0x0 留给复位处理程序 然后在复位处理程序内初始化 SP 我认为这属于
  • 使用 SQLITE3 和 Objective C 转换 DATETIME 时出现问题

    我有一个 sqlite3 数据库 其中包含 DATETIME 列 其中包含格式如下的值 2013 01 09 04 00 00 我想弄清楚如何确定时间是上午还是下午 以下是我如何使用 Objective C 从 Sqlite3 DB 读取和
  • Puppeteer chrome 获得活动/可见选项卡

    在 Chrome 扩展中 您可以使用下面的命令来查找窗口中的活动选项卡 chrome tabs query currentWindow true active true 我有一个连接到现有浏览器并获取所有页面的以下代码 我无法确定是否有办法
  • Angularjs:复选框和 ng-change

    我无法理解 ng change 的工作原理 我有一份邀请参加拍卖的用户列表 我想用一个复选框来做到这一点 如果选中用户 则必须将其姓名保存到数组中 稍后我会邀请他们 我只知道该怎么做 但我不明白如何使用该复选框 我做了这样的事情 ul cl
  • 地图视图删除多个图钉

    我想在地图上显示用户位置并放置一个图钉 但我的应用程序放置了两个相距一定距离的图钉 我想知道当新图钉被放置时如何删除旧图钉 以便地图上应该有一个图钉我的代码是 MKAnnotationView mapView MKMapView mV vi
  • 如何安装rabbitmq管理插件(rabbitmq-plugins)

    简短的 有没有办法通过ubuntu包安装rabbitmq plugins Details 我的rabbitmq 在我的ubuntu 系统中运行正常 现在我正在尝试通过管理插件监控正在发生的情况 我正在按照rabbitmq com manag
  • 如何在 .vimrc 文件中“获取”某些内容?

    我最近一直在努力扩展我的 vim foo 并且遇到了几个插件 自动标记 vim http www vim org scripts script php script id 1343例如 要求它们在我的 vimrc 文件中 来源 这到底是什么
  • SQL DATETIME 从 Excel 插入?

    所以我遇到了一个相当奇怪的问题 我在Excel中有一个列 比如说A列 其中的数据如下所示 2015年4月11日 10 14 我还有很多其他列 但无论如何在 Excel 中的 SQL Insert 语句中 数据 复制时 如下所示 42105
  • java中如何转义文件路径中的反斜杠和自动生成的转义字符

    我有一个非常小而简单的问题 但我没有得到解决方案 实际上我正在使用文件选择器获取 CSV 文件路径 我使用加载数据本地 infile 查询将此 csv 文件中的数据输入到数据库中 假设我输入的文件路径是 C title csv 当我将此字符
  • 使用 lldb 调用带有字符串参数的函数:如何?

    我无法使用 lldb 调用采用字符串参数的简单非模板化函数 有没有办法让 lldb 理解 C 数据类型 字符串 这是 C 程序中常用的数据类型 这里的示例源代码只是创建一个带有几个构造函数的简单类 然后调用它们 省略了 iostream 和
  • Java 中什么是可调用的?

    标题几乎概括了它 我想了解 callable 的概念和思想 我读过一篇在这里提问 https stackoverflow com questions 141284 the difference between the runnable an
  • 函数返回另一个函数的返回值

    如果我想打电话Bar 代替Foo does Bar 返回 Foo 返回的副本 额外开销 或者返回与Foo 临时堆栈上的位置 vector
  • 如何使用 Google Apps 脚本获取单元格的格式化值

    我想使用 Google Apps 脚本通过连接 Google 电子表格中所选单元格的值来创建字符串 问题是我不知道单元格是否包含数字 日期或文本 当值是数字或日期时 我想获取格式化值 即它在电子表格中显示的方式 例如 以下函数将返回命名范围
  • TabBarController didSelectViewController 不工作

    我知道这是一个非常重复的话题 但我无法让它发挥作用 主选项卡 h import
  • Django settings.py:单独的本地和全局配置

    我想知道是否可以将 Django 中的 本地 配置 静态的本地路径 必须是绝对的模板内容 本地数据库信息等 与 全局 配置 URL 中间件类 分开 安装的应用程序等 这样几个人就可以通过 Git 或 SVN 处理同一个项目 而不必在每次完成
  • FB.ui 和设置弹出窗口大小

    我正在使用 FB ui 并将显示参数设置为弹出 当方法为 stream publish 时 它会在加载内容时自动调整大小 但是 当使用 fbml dialog 为了显示多好友选择器 时 它显示的大小我无法更改 并且内容显示为裁剪的 我尝试过
  • 将 django-allauth 作为端点插入 django-rest-framework

    我在我的网站上使用 django allauth 进行社交登录 我还有一个由 django rest framework 提供支持的 REST API 用作移动应用程序的后端 有没有办法可以直接将 allauth 的身份验证后端插入 RES
  • js和template标签对比

    如何比较 profile id 和 JavaScript 变量profile id function compare profile id if profile id profilegroup subject id do something
  • 是否可以用 C# 创建有状态的 Web 服务?

    我现在有这样的东西 public class Service1 System Web Services WebService WebMethod public string Method1 SomeObj so SomeClass GetS
  • 不可预测的双重[重复]

    这个问题在这里已经有答案了 可能的重复 NET 上的双精度问题 https stackoverflow com questions 566958 double precision problems on net 双重计算产生奇数结果 htt