您的位置:首页 > 其它

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

2016-12-28 16:59 369 查看

浮点数定义

在计算机科学中,浮点(英语: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());


参考文章

浮点数

IEEE 754

Java中浮点型数据Float和Double进行精确计算的问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: