首页 > 其他分享 >0.1 + 0.2 不等于 0.3?

0.1 + 0.2 不等于 0.3?

时间:2024-09-09 20:38:25浏览次数:12  
标签:10 0.1 0.3 0.2 质因数 小数

问题

在计算机编程中有时会遇到一些需要做分支判断的情况,例如:

if(0.1 + 0.2 == 0.3){
  cout << "yes" << endl;
}else{
  cout << "no" << endl;  
}

但是最后发现走的分支一直都是else的分支,为什么会出现上述的原因呢?

这是因为在计算机中使用的是二进制的浮点数,通常使用IEEE 754标准进行表示,这就导致一些特殊的值不能准确的表示出来(0.1、0.2、0.3)。

背后的原理

在十进制系统中,如果一个分数使用基数(10)的质因数来表示,那么它可以被精确地表示。
10 的质因数是 2 和 5。
因此,1/2、1/4、1/5 (0.2)、1/8 和 1/10 (0.1) 可以被精确地表示,因为分母使用了 10 的质因数。
而 1/3、1/6 和 1/7 是无限循环的小数,因为分母使用了 3 或 7 的质因数。
在二进制(计算机使用的系统)中,如果一个分数使用基数(2)的质因数来表示,那么它可以被精确地表示。
2 是 2 的唯一质因数。
因此,1/2、1/4 和 1/8 都可以被精确地表示,因为分母使用了 2 的质因数。
而 1/5 (0.2) 或 1/10 (0.1) 是无限循环的小数,因为分母使用了 5 或 10 的质因数。
所以当我们尝试表示像 0.1 这样的十进制小数时,计算机会使用一个近似值。这个近似值是通过将无限循环的二进制小数转换为有限位数的浮点数表示来实现的。
因此,当我们在计算机中进行浮点数运算时,结果可能会有微小的误差。

解决方法

1.先将小数转换为整数来进行计算,计算完成后再转换成浮点数

if(0.1*10 + 0.2*10 == 0.3*10){
    cout << "yes" << endl;
}else{
	cout << "no" << endl;
}

2.计算两者的差值是否小于某一个误差范围

if(abs(0.1 + 0.2 - 0.3) < 1e-6){
    cout << "yes" << endl;
}else{
	cout << "no" << endl;
}

3.使用各类语言中的一些特殊函数。

标签:10,0.1,0.3,0.2,质因数,小数
From: https://www.cnblogs.com/aloneqing/p/18405279

相关文章

  • AJAX家政系统V1.0.1
    一款同城预约、上门服务、到店核销家政系统,用户端、服务端(高级授权)、门店端(高级授权)各端相互依赖又相互独立,支持选择项目、选择服务人员、选择门店多种下单方式,支持上门服务和到店核销两种服务方式,支持自营和多商家联营(高级授权)两种运营模式,同时支持多城市并且设置每个城......
  • centos7.9安装mysql8.0.39
    1.添加MySQLYum仓库首先,需要下载并安装MySQLYum仓库RPM包:sudorpm-Uvhhttps://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm2.更新Yum缓存安装完Yum仓库后,更新Yum缓存:sudoyumcleanallsudoyummakecache3.安装MySQL 现在可以......
  • 【2024潇湘夜雨】WIN11_PWK_21H2.22000.3147软件选装纯净特别版9.08
    【系统简介】=============================================================1.本次更新母盘来自WIN11_PWK_21H2.22000.3147(专业工作站版).2.全程离线精简、无人值守调用优化处理制作。部分优化适配系统可能要重启几次,即使显示适配失败也不要在意,可能部分优化不适用。3.OS版本号为2......
  • Gitlab-ce upgrade 16.0.1 to 17.3.1【Gitlab-ce 16.0.1 升级 17.3.1】
    文章目录背景gitlab-ce16.0.1升级17.3.1失败gitlab-ce16.0.1升级16.11.8失败gitlab-ce16.0.1升级16.7.9失败gitlab-ce16.0.1升级16.3.8成功gitlab-ce16.3.8升级16.11.8失败gitlab-ce16.3.8升级16.7.9成功gitlab-ce16.7.9升级16.11.8成功gitlab-ce16.......
  • Oracle 12.2.0.1.0单实例安装补丁
    ......
  • 印度雷军凭智能表实现市占率从0.3%到30%飞跃
    有温度有深度&nbsp;通俗易懂的独立站就等你来关注增速迅猛的印度市场只要一说起印度,大家就觉得印度阿三是消费力弱,爱讨价还价。但是现在全球经济低迷,复苏也需时日。但是印度市场其实近几年还是一直蓬勃发展。智能手表发展史印度市场飞速发展的过程中,比较亮眼的产品......
  • 海报在线制作系统V1.0.3
    V1.0.3修复已知问题1、兼容多平台云存储上传2、修复小程序端海报背景图片不生成3、修复pc端登录问题4、修复海报删除问题......
  • 【Google Play】高德地图13.20.0.1451最新国际版(如何鉴别是否官方?)
    高德地图,您的全方位出行助手,让您无论走到哪里都能熟悉一切。无论是寻找美食还是探索旅游景点,高德地图都能为您提供详尽的信息。有了高德地图在手,您可以轻松畅游世界各地,享受无忧无虑的旅行体验。提供包括驾车、公交和步行在内的多种出行方式智能导航服务,中文界面让使用更......
  • 米扬约课健身管理系统小程序V2.0.1
    米扬约课健身管理系统,应用于健身房,健身工作室,运动会所,运动场馆,瑜伽馆,拳馆等泛健身行业的场馆中。米扬约课健身致力于为各种健身场馆打造真正有效的营销系统,简洁易用的客户信息管理系统,适合多门店、多角色、多场景的服务系统,紧跟健身行业的进步与升级,为广大客户提供优质的服务。V2.0......
  • AURIX™ Development Studio1.10.2(ADS)安装使用教程
    零、介绍AURIX™DevelopmentStudio是Infineon为TriCore™-basedAURIX™microcontroller系列车规单片机设计的一款免费IDE(集成开发环境),基于EclipseIDE开发。其包含了C编译器、TASKING调试器、多核调试器、iLLD库等功能。用户可通过AURIX™DevelopmentStudio-InfineonT......