浮点数的比较问题

问题描述
浮点数的比较
输出:no

问题解释
计算机内部以二进制储存,一切数据都将转化为二进制储存在计算机中

一个小数分为整数部分和小数部分 而小数和整数的转化为二进制的规则不同~~该问题的本质原因)~~

以23.45说明
整数部分的转化(基数除法)
在这里插入图片描述
整数部分的转化没有任何问题
小数部分的转化(基数乘法)

在这里插入图片描述
只是有部分小数转化为二进制会循环但不是都是这样
例如:
在这里插入图片描述该

可以看出进行小数部分的转换出现了循环的情况
说明最后最后储存在计算机内部数据不是23.45000000,
实际数据变成了这样:
在这里插入图片描述

实际上这只是造成该现象的原因之一 一下是另一个原因

介于浮点数转化为二进制会出现循环的情况,计算机为里保证数据的精度,会将实数常量自动转化为double型,因为double的精度高
在这里插入图片描述
对上图储存过程的解释
float a=1.1;
1.1就是实数常量,计算机看到1.1会先将其转化为二进制储存,当然小数部分循环 例如 转化后实际为 1.12346577765446546543433…….计算机为了精度尽可能的高会截断储存在double中

然后将1.1储存后的值赋给a,此处注意1.1此时是double,而要储存在float里面 float占4个字节,double占8个字节,此时要将1.1截断后4个字节放到a中
截断图示:
在这里插入图片描述

然后 if(a==1.1)
此时a是1.1的double型截断后的数值,1.1是double型,不可能相等

这种情况的解决方法

  • 加后缀
    通过在比较的时候 对1.1加后缀为1.1f 相当于将1.1也从double截断成了floatd
    在这里插入图片描述
  • 改变a的数据类型
    通过改变a的数据类型 让其不发生截断
    在这里插入图片描述
    总结:不要轻易的比较2个浮点数的大小
    一定比较的话 一般将2个浮点数相减 结果小于可以容忍的数 则可以判定2数相等

计算机内部的数据转化规则

问题引出:’a’+345+123.3456*3454-3465 进行混合运算时数据的转换

转换规则
在这里插入图片描述

规定:恒方向是必须转的
纵向 低位向高位转换
一直转到2个或3个(看是几目运算)数据的数据类型相同为止
规定:2个数据类型相同的数据运算 结果为的数据类型为源数据类型

当然数据的运算顺序还要考虑优先级和结合性 这里不作描述

对于数据转换照成的几个误区

  • 整数除法
    在这里插入图片描述
    1/2 1和2都是整型 答案也是为整型 答案为0 后面的小数被丢失了
  • 无符号的陷阱
    在这里插入图片描述
    a为signed int型数据 即都是正的
    a-b int为地位 会向高位转换位signed int 然后再运算 结果也是signed int 型数据
    期望a-b是一个负数 实际上 答案是一个正数

原文地址:http://www.cnblogs.com/swtaa/p/16888671.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性