浮点数定义
在计算机科学中,浮点(英语:floating point,缩写为FP)是一种对于实数的近似值数值表现法,由一个有效数字(即尾数)加上幂数来表示,通常是乘以某个基数的整数次指数得到。以这种表示法表示的数值,称为浮点数(floating-point number)。
对浮点数的误用
让我们来看看下面这段代码(这段代码在jdk1.6中测试过)
double PI = 3.14;
System.out.println(PI*10);
通常新手会错误的认为会输出31.4
,但是事实却并不是这样,这段代码会输出31.400000000000002
。
为什么会出现这样的输出结果呢?
我们得从浮点数在计算机中的存储结构说起。
由于现在的大部分计算机都是通过二进制方式计算和存储数据,所以我们生活中常用的十进制数据,要是想在保存在计算机中,就需要进行十进制和二进制的转换。我们常见的整数可以很方便地进行十进制转二进制,但是还有许多的实数,比如小数,是很难直接进行转换的,所以就有了浮点数的概念。
浮点数进行精确计算
一般浮点数进行精确计算的方式就是,化整整除。比如:计算3.14*0.2
,我们可以把它的每一个操作数都变成整数做乘法,之后再除去变大的倍数,即314*2/1000
在《Effective Java》这本书中就给出了一个解决方法。该书中也指出,float和double只能用来做科学计算或者是工程计算,在商业计算等精确计算中,我们要用java.math.BigDecimal。
例如:
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
System.out.println(b1.multiply(b2).doubleValue());