1、精度丢失
作为程序员大家应该都遇到过下面这种情况,用浮点数做运算,发现结果与预期有偏差,比如下面的JAVA代码
public static void main( String[] args )
{
int i = 3;
float j = 0.9f;
System.out.println("3乘以0.9的结果是:" + i*j);
}
用一个整数3乘以浮点数0.9,期望结果是2.7,实际结果却是
与2.7相差0.0000002,这道连小学生都不会算错的题目,为什么计算机会算错?真正的原因要从计算机保存浮点数的底层原理说起。
2、计算机如何保存浮点数
2.1、二进制小数
在计算机中数字使用二进制方式存储,所以理解浮点数的第一步是理解如何用二进制表示小数。
首先,对于我们比较了解的十进制,可以使用下面的公式表示:
dmdm-1···d1d0.d-1d-2···d-n
d的取值范围是0-9的任意数字。
m则从左向右依次递减,在小数点左边m=0,小数点右边m=-1。
在小数点左边的数字,取10的m次正幂,得到整数。小数点右边则取10的m次负幂,得到小数。例如12.34 表示数字
1×101+2×100+3×10−1+4×10−2=12