浮点数在计算机内的存储分为三部分
符号位 (第1位)
指数部分
尾数部分(在二进制下保证在1-2之间,开头都是1可以截掉)
这种结构也导致浮点数之间的运算较慢,并提高了浮点型的范围
并不是位数越多越慢,在有些机器上double计算要快于float,这些并没有统一标准
1.运算时舍入误差
注意:
仅在运算时出现误差,浮点数在一定位数之后一旦进行 + - * / 等运算,会导致出现极其微小的误差
但是:
如果直接让 float a = 2; a==2 会是true
一旦进行运算,则会出现不可控的误差
float a = 100;
if( Math.Abs( a-100 ) < 0.00001f )
{
//判断a和100近似相等
}
2.部分语言表示大数时精度丢失
float 使用指数-尾数形式表示数值。
如果允许指数部分的位数不限,虽然可以表示更大的数,但是会降低数值的分辨率。
举个例子:
float 制定了 8 bit 来表示指数部分,既能表示很大的数,又能保证较高的数值分辨率。
如果指数部分超过8位,可能会占用小数位表示指数,这样就可以表示非常大的数,甚至能做到远超long,但是会降低小数位的精度。
这也是”浮点“的由来,浮动的小数点
在C语言中,至少会保证6位的有效数字,无需担心精度问题。