BigDecimal代替浮点数精确计算用法简介

浮点数

浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法。

浮点计算是指浮点数参与的运算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。
一个浮点数a由两个数m和e来表示:a = m × b^e。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。

BigDecimal

在Java中,float声明的变量是单精度浮点数,double声明的变量是双精度浮点数,顾名思义就是double型的实体占用内存空间是float的两倍。float是4个字节而double是8个字节。float和double类型的数据,无法精确表示计算结果,这是由于float和double是不精确的计算。大家可以通过下面代码可以看出来:

public class Test{  
  public static void main(String[] args)  
    {    
    System.out.println(0.05 + 0.01);   
     System.out.println(1.0 - 0.42);   
      System.out.println(4.015 * 100);    
      System.out.println(123.3 / 100);   
       }
      }

运行的结果为:
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
要想获得理想的结果,我们可以考虑使用BigDecimal来获得更精确的计算:
BigDecimal提供了多个构造函数,和浮点数有关的有:
BigDecimal(double val)  Translates a double into a BigDecimal.
BigDecimal(String val) Translates the String repre sentation of a BigDecimal into a BigDecimal.
但是用double参数来创建对象得到不精确的值,只有通过String来创建对象才是最准确的。
例如:
BigDecimal data1=new BigDecimal(0.05);
System.out.println(data1.toString());
BigDecimal data2=new BigDecimal("0.05");
System.out.println(data2.toString());
得到结果:
0.05000000000000000277555756156289135105907917022705078125
0.05
所以,我们最终需要使用String来创建对象,这样得到的结果才是最精确的。另外,如果是double数,我们还可以使用:BigDecimal.valueOf(double val),原因很简单,其JDK源码如下所示:

public static BigDecimal valueOf(double val)
{ 
   return new BigDecimal(Double.toString(val));
 }

最后需要说明的是:BigDecimal的加减乘除其实最终都返回的是一个新的BigDecimal对象,因为BigDecimal是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以a.add(b);虽然做了加法操作,但是a并没有保存加操作后的值,正确的用法应该是a=a.add(b)。

参考文章:

http://swiftlet.net/archives/798

 

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1690814

时间: 2024-11-03 22:43:48

BigDecimal代替浮点数精确计算用法简介的相关文章

js浮点数精确计算

 本篇文章主要介绍了js浮点数精确计算(加.减.乘.除) 需要的朋友可以过来参考下,希望对大家有所帮助 代码如下: <SPAN style="FONT-SIZE: 18px">//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果.    //调用:accAdd(arg1,arg2)    //返回值:arg1加上arg2的精确结果    function accAdd(arg1,arg2){       var

js浮点数精确计算(加、减、乘、除)_javascript技巧

复制代码 代码如下: <SPAN style="FONT-SIZE: 18px">//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果.   //调用:accAdd(arg1,arg2)   //返回值:arg1加上arg2的精确结果   function accAdd(arg1,arg2){      var r1,r2,m;      try{r1=arg1.toString().split(".&

用java实现浮点数的精确计算

问题的提出: 如果我们编译运行下面这个程序会看到什么? public class Test{ public static void main(String args[]){ System.out.println(0.05+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100); System.out.println(123.3/100); }}; 你没有看错!结果确实是 0.060000000000000005 0.5

JS/PHP 浮点数精确运算

如果用PHP的算术计算浮点数的时候,可能会遇到一些计算结果错误的问题 Java代码   <?php   $a = 0.1;   $b = 0.7;   var_dump(($a + $b) == 0.8); //false   $f = 0.58;   var_dump(intval($f * 100)); //为啥输出57   解决方案:安装bcmath这个扩展 bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string

简单谈谈php浮点数精确运算_php技巧

bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_operand, string $right_operand[, int $scale]),如果scale没有提供,就用bcscale的缺省值.这里大数直接用一个由0-9组成的string表示,计算结果返回的也是一个 string. bcadd - 将两个高精度数字相加 bccomp - 比较两个高精度数字,返回-1, 0, 1

Java中精确计算的一个类用BigDecimal

这个类确实好用.在网上找到大的,是一个女Java程序员写的.厉害~~~~~~哈哈/* * 创建日期 2004-10-14 * * 如果需要精确计算,非要用String来够造BigDecimal不可 */package com.lims.actions.testqc.comm; /** * @author Jstar * * * 窗口 > 首选项 > Java > 代码生成 > 代码和注释 */import java.math.BigDecimal; /*** 由于Java的简单类型

php浮点数精确运算

bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_operand, string $right_operand[, int $scale]),如果scale没有提供,就用bcscale的缺省值.这里大数直接用一个由0-9组成的string表示,计算结果返回的也是一个 string. bcadd - 将两个高精度数字相加 bccomp - 比较两个高精度数字,返回-1, 0, 1

Linux的yum命令用法简介

1.什么是 yum yum 是 yellowdog updater modified 的缩写.yellowdog 是一个 Linux 的 distribution,RH 将这种升级技术利用到自己的 distribution 形成了现在的 yum,感觉上 yum 和 apt 的原理类似,但是 apt 是编译代码,执行效率远高于使用 python 写成的 yum. yum 的理念是使用一个中心仓库(repository)管理一部分甚至一个 distribution 的应用程序相互关系,根据计算出来的

PHP精确计算功能示例_php技巧

本文实例讲述了PHP精确计算功能.分享给大家供大家参考,具体如下: 引言:一定要确保数据的准确性.这是一个好的程序员的基本素养. <?php /** * 精确加法 * @param [type] $a [description] * @param [type] $b [description] */ function math_add($a,$b,$scale = '2') { return bcadd($a,$b,$scale); } /** * 精确减法 * @param [type] $a