浮点数进行精确计算的问题

浮点数定义

在计算机科学中,浮点(英语:floating point,缩写为FP)是一种对于实数的近似值数值表现法,由一个有效数字(即尾数)加上幂数来表示,通常是乘以某个基数的整数次指数得到。以这种表示法表示的数值,称为浮点数(floating-point number)。

浮点数进行精确计算的问题_第1张图片
浮点数表示方式

对浮点数的误用

让我们来看看下面这段代码(这段代码在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());

参考文章

  • 浮点数
  • IEEE 754
  • Java中浮点型数据Float和Double进行精确计算的问题

你可能感兴趣的:(浮点数进行精确计算的问题)