问题:二进制小数与十进制小数的对应关系是怎样的?
[注]一个二进制小数一定对应一个十进制小数,但一个十进制小数不一定有一个二进制小数与之对应,也就是说二进制小数与十进制小数之间并不是一 一对应的关系:相邻的两个二进制小数对应的十进制小数并不是连续的,而是存在一定的间隔的. 我们以和这两个二进制小数为例,位于和这两个二进制小数之间的十进制值就没有与之对应的二进制小数,只能用这两个二进制小数之一作为近似替代(尾数为23位):这说明十进制小数转化为二进制小数时,并不都是精确的. 由于二进制小数对应的十进制小数是离散的,因此就会出现多个近似相等的十进制小数要用同一个二进制小数来表示的情况. 因此我们说浮点数并非真正意义上的实数,它只其在某种范围内的近似表达.
[注]受浮点数表示精度的限制,我们不能直接比较两个浮点数的相等与否(只能比较两个浮点数的近似相等).
[注]并非所有的实数都能用有限位的尾数来精确表达.
当我们将一个十进制小数赋值给一个单精度实型变量时,要经过一个从十进制小数转换为二进制小数的过程(内存中都是以二进制形式存储信息),由于并不是每一个十进制小数都有与之对应的二进制小数,因此在转换过程中可能存在数据精度丢失现象. 当需要以十进制形式输出这个二进制小数时,由于每一个二进制小数都有与之对应的十进制小数,在二进制小数转换为十进制小数的过程中,不会发生数据精度丢失现象. 但在一开始十进制小数转换为二进制小数的过程中,可能已经存在数据精度丢失现象,所以最终输出的这个十进制小数并不一定和最开始的那个值完全一致.
问题:既然浮点型数据的表示范围更加宽广,为什么不直接用浮点型替代整型呢?
数据精度问题是浮点型无法取代整型的一个重要原因.
精度损失实例分析1:
精度损失实例分析2:
将上述程序的变量a和b修改为long类型,就可解决数据精度丢失的问题.
也可将变量a和b修改为double类型,这样也可以解决数据精度丢失的问题. 但是如此做会白白消耗大量内存空间. 另外,整型数据的运算速度比浮点型数据快得多.
[注]float类型只能保证7位的有效数字(7位之后都是不准确的), double类型只能保证16位的有效数字(16位之后都是不准确的).
[注]如果某个变量用整型来表示就已足够,这时应避免使用浮点类型(尤其是在将一个很大的数和一个很小的数做加减运算时).
文章来源: blog.csdn.net,作者:好梦成真Kevin,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_42048463/article/details/115052821