浮点数比较和计算机内部数据转换
浮点数的比较问题
问题描述
输出: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是一个负数 实际上 答案是一个正数