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

作者: craneyuan | 来源:发表于2016-12-28 17:01 被阅读220次

浮点数定义

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

参考文章

相关文章

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

    浮点数定义 在计算机科学中,浮点(英语:floating point,缩写为FP)是一种对于实数的近似值数值表现法...

  • 第11章 编写精确代码所需编码准则

    11.1 计算机并不如想象得那么精确 数字电路机器无法准确表示小数。 11.2 需要进行精确计算时避开浮点数运算 ...

  • Python3 - 执行精确的浮点数运算

    问题 对浮点数执行精确的计算操作,并且不希望有任何小误差的出现。 解决方案 浮点数的一个普遍问题是它们并不能精确的...

  • MySQL浮点计算存在的问题与解决方案

    在计算机中,浮点数往往很难精确表示,那么浮点数运算结果也往往难以精确表示。MySQL同样也存在这个问题。 解决方案...

  • python3学习笔记:执行精确的小数计算

    问题 我们需要对小数进行精确计算,不希望因为浮点数天生的误差而带来影响 解决方案 使用decimal模块,牺牲一些...

  • BigDecimal大精度小数

    BigDecimal用于精度计算 输出结果: 在计算数值的时候,由于浮点数没有办法精确的对二进制进行计算,所以经常...

  • 浮点数丢失精度问题

    浮点数在操作时不能得到很精确的结果,比如如下代码并未返回0.06。这就是浮点数丢失精度的问题。 我们平时在数字计算...

  • 使用BigDecimal对浮点数进行精确计算

    问题 Java的简单类型不能够精确的对浮点数进行运算。比如: 控制台截图 解决方案 使用JDK提供的BigDeci...

  • 个人代码库-待更新

    JS 浮点数相加不精确解决 浮点数取两位小数 css 内计算 input 按钮美化(input 上传框美化实例)

  • Java 浮点数精确计算

    示例代码 运行结果 是不是怀疑以上结果写错了?但是结果确实是这样的,你可以亲自运行以上代码试试。 WHY? 为什么...

网友评论

    本文标题:浮点数进行精确计算的问题

    本文链接:https://www.haomeiwen.com/subject/ejgyvttx.html