首页 > 其他分享 >浮点数比较和计算机内部数据转换

浮点数比较和计算机内部数据转换

时间:2022-11-14 12:46:01浏览次数:37  
标签:转换 计算机 double 浮点数 数据类型 转化 1.1 小数

浮点数的比较问题

问题描述
浮点数的比较
输出: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是一个负数 实际上 答案是一个正数

标签:转换,计算机,double,浮点数,数据类型,转化,1.1,小数
From: https://www.cnblogs.com/swtaa/p/16888671.html

相关文章