首先,两个 if 是一样的。浮点数和整数比较时,整数被转为浮点数。

然后,i 为什么不等于 10.0?因为它只会等于这些值:

>>> def gen():

... i = 0

... while i < 10:

... i += 0.1

... yield i

...

>>> L = list(gen())

>>> L

[0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999, 1.0999999999999999, 1.2, 1.3, 1.4000000000000001, 1.5000000000000002, 1.6000000000000003, 1.7000000000000004, 1.8000000000000005, 1.9000000000000006, 2.0000000000000004, 2.1000000000000005, 2.2000000000000006, 2.3000000000000007, 2.400000000000001, 2.500000000000001, 2.600000000000001, 2.700000000000001, 2.800000000000001, 2.9000000000000012, 3.0000000000000013, 3.1000000000000014, 3.2000000000000015, 3.3000000000000016, 3.4000000000000017, 3.5000000000000018, 3.600000000000002, 3.700000000000002, 3.800000000000002, 3.900000000000002, 4.000000000000002, 4.100000000000001, 4.200000000000001, 4.300000000000001, 4.4, 4.5, 4.6, 4.699999999999999, 4.799999999999999, 4.899999999999999, 4.999999999999998, 5.099999999999998, 5.1999999999999975, 5.299999999999997, 5.399999999999997, 5.4999999999999964, 5.599999999999996, 5.699999999999996, 5.799999999999995, 5.899999999999995, 5.999999999999995, 6.099999999999994, 6.199999999999994, 6.299999999999994, 6.399999999999993, 6.499999999999993, 6.5999999999999925, 6.699999999999992, 6.799999999999992, 6.8999999999999915, 6.999999999999991, 7.099999999999991, 7.19999999999999, 7.29999999999999, 7.39999999999999, 7.499999999999989, 7.599999999999989, 7.699999999999989, 7.799999999999988, 7.899999999999988, 7.999999999999988, 8.099999999999987, 8.199999999999987, 8.299999999999986, 8.399999999999986, 8.499999999999986, 8.599999999999985, 8.699999999999985, 8.799999999999985, 8.899999999999984, 8.999999999999984, 9.099999999999984, 9.199999999999983, 9.299999999999983, 9.399999999999983, 9.499999999999982, 9.599999999999982, 9.699999999999982, 9.799999999999981, 9.89999999999998, 9.99999999999998, 10.09999999999998]

你可以看到,浮点数十进制转二进制有误差。100 次误差积累之后,i 只会等于 9.99999999999998。(我使用的是 Python 3.6,浮点数的十进制表示会采用等价表示法中最短的。它也是采用与 C 语言相同的内部表示。)

浮点数在计算机中是以二进制形式表示和运算的(通常使用 IEEE 754 标准),而 0.1 不能精确地用二进制来表示(是循环小数;只有分母只包含因子 2 的小数,使用二进制表示时才不会循环)。这样一来就会有误差。误差积累之下,它会就偏离十进制越来越远。

如果你需要比较相等性,可以与指定的数求差,如果差值小于特定值(比如 Python 里有 math.isclose 函数),就认为相等。

如果你需要精确值(比如做金融计算,一分钱也不能少的那种),你可以使用所谓的「十进制数」来运算(decimal,Python 和 Ruby 都支持的。也可以使用 mpdecimal 库),或者指定精度(比如使用 mpfr 库),或者使用定点数。

c语言float判断相等,c/c++ 比较两个浮点数相等相关推荐

  1. C语言中判断浮点数是否等于0

    1.C语言中判断浮点数是否等于0: 2.C语言中判断两个浮点数是否相等: float.double分别遵循R32-24,R64-53的标准.他们尾数的位数分别是23.52,即误差在2^-23,2^-5 ...

  2. c语言:判断某人是否属于肥胖体型。根据身高与体重因素,医务工作者经广泛的调查分析给出了以下按“体指数”对肥胖程度的划分:体指数t=w/(h*h)(w为体重,单位为kg,h为身高,单位为m)。

    c语言:判断某人是否属于肥胖体型.根据身高与体重因素,医务工作者经广泛的调查分析给出了以下按"体指数"对肥胖程度的划分:体指数t=w/(h*h)(w为体重,单位为kg,h为身高,单 ...

  3. c语言程序判断32位还是64位,c++ 判断是64位还是32位系统的实例

    1.IsWow64Process 确定指定进程是否运行在64位操作系统的32环境(Wow64)下. 语法 BOOL WINAPI IsWow64Process( __in HANDLE hProces ...

  4. linux检查socekt是否断开,如何在C语言中判断socket是否已经断开

    如果不主动关闭socket的话,系统不会自动关闭的,除非当前进程挂掉了,操作系统把占用的socket回收了才会关闭.小编今天跟大家简单介绍下如何在C语言中判断socket是否已经断开 下面来介绍判断非 ...

  5. C语言程序判断计算机的CPU大小端

    如何判断一台计算机的CPU是大端还是小字端对齐呢? 那么首先得了解何为大端,何为小端,明确一下概念. 所谓大端模式,是指字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中. 小端格式:与大 ...

  6. C语言条件判断 if / else - C语言零基础入门教程

    目录 一.C 语言条件判断 if 1.if 语法 2.if 实战 二.C 语言条件判断 if / else 1.if / else 语法 2.if / else 实战 三.猜你喜欢 零基础 C/C++ ...

  7. c语言中判断输入是否为数字_C语言编程判断回文数

    大家好,我是阿汤哥,前两天在公众号后台收到一个朋友问回文数,今天我们就来谈谈怎么用C语言编程判断一个数是不是回文数. 怎么判断回文数? 首先看定义,什么是回文数. 回文数 定义: 设n是一任意自然数. ...

  8. C语言float数据类型介绍、示例和应用经验

    文章目录 1.浮点数的概念 2.测试float数据类型 3.应用经验 4.获取视频教程 5.版权声明 1.浮点数的概念 浮点数也称小数或实数.例如,0.0.75.0.4.023.0.27.-937.1 ...

  9. c语言判断字符串的编码,C语言中判断一个char*是不是utf8编码

    C语言中判断一个char*是不是utf8编码 里我修改了一下, 纯ASCII编码的字符串也返回true, 因为UTF8和ASCII兼容 实例代码: int utf8_check(const char* ...

最新文章

  1. 【Android开发】:在任意目录执行NDK编译
  2. Linux 下解压文件命令大全
  3. NUMA架构的CPU -- 你真的用好了么?
  4. 【转载保存】网页提取正文算法汇总
  5. python测试工具开发面试宝典3web抓取
  6. 计算机科学与技术文科可以学么,文科生成绩一般,大学可以选择计算机吗?
  7. 漫画:趣解鸿蒙 OS 如何实现跨平台?
  8. ubuntu workbench
  9. Java发送https请求,综合post请求,get请求,获取网络返回的信息
  10. 2021-05-11
  11. 2021年3月CISSP考试顺利通过,超详细的经验介绍
  12. 如何计算机画函数图形,Excel中怎么绘制出好看的函数图像
  13. 一条 SQL 语句是如何执行的
  14. druid 查条数_Druid.io查询分析
  15. Napster 成立 | 历史上的今天
  16. cf1064E. Dwarves, Hats and Extrasensory Abilities(二分 交互)
  17. 同时安装wampserver和xampp
  18. solr搜索之搜索精度问题我已经尽力了!!!
  19. 安卓开发报错:“unfortunately,sy6 has stopped”
  20. 电脑不能创建txt文件解决方法

热门文章

  1. r语言 fread函数参数_R语言 第4章 初级绘图(6)
  2. java实现extended smtp_java实现发送邮件(SMTP)
  3. java 位运算 权限控制_java 位运算权限管控(转载)
  4. Java之HashMap.values()转List时的错误和正确操作
  5. Spring Boot配置MinIO(实现文件上传、下载、删除)
  6. 为什么要重写hashCode()方法和equals()方法以及如何进行重写
  7. springboot配置跨mapper.xml的全局变量
  8. flash调用swf文件服务器,浏览器如何加载Flash文件? (SWF)
  9. datagridview 手动添加的行如何进行重载_【厚积薄发】如何规划UI图标图集
  10. JDBC进行事务管理