BigDecimal精度计算

      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

原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。

其实java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。

下面是一个工具类,该工具类提供加,减,乘,除运算。

public class Arith {

    /**
     * 加法运算
     * @param value1
     * @param value2
     * @return
     */
    public static double add(double value1,double value2){
        BigDecimal b1 = BigDecimal.valueOf(value1);
        BigDecimal b2 = BigDecimal.valueOf(value2);

        return b1.add(b2).doubleValue();
    }

    /**
     * 减法运算
     * @param value1 被减数
     * @param value2 减数
     * @return
     */
    public static double sub(double value1,double value2){
        BigDecimal b1 = BigDecimal.valueOf(value1);
        BigDecimal b2 = BigDecimal.valueOf(value2);

        return b1.subtract(b2).doubleValue();
    }

    /**
     * 乘法运算
     * @param value1 被乘数
     * @param value2 乘数
     * @return 乘积
     */
    public static double mul(double value1,double value2){
        BigDecimal b1 = BigDecimal.valueOf(value1);
        BigDecimal b2 = BigDecimal.valueOf(value2);

        return b1.multiply(b2).doubleValue();
    }

    /**
     * 出发运算
     * @param value1 被除数
     * @param value2 除数
     * @param scale 精确范围
     * @return
     * @throws IllegalAccessException
     */
    public static double div(double value1,double value2,int scale) throws IllegalAccessException {
        if(scale<0){
            throw  new IllegalAccessException("精确度不能小于0");
        }
        BigDecimal b1 = BigDecimal.valueOf(value1);
        BigDecimal b2 = BigDecimal.valueOf(value2);

        return b1.divide(b2,scale, RoundingMode.UP).doubleValue();
    }
}
时间: 2025-01-20 02:08:24

BigDecimal精度计算的相关文章

精度计算-大数阶乘

精度计算-大数阶乘 本算法的目的在于计算一个比较大的数的阶乘,由于得到的结果比较大,是现有的数据类型无法存储的,所以我决定将结果存储在一个long a[]数组中. 我们的思路是把每4位数看做数组的一个元素来存储,例如:个.十.百.千存在a[0],万.十万.百万.千万存在a[1]以此类推. 我们用10的阶乘来模拟一下求结果大于4位数阶乘的过程,9的阶乘为362880,而10的阶乘为9的阶乘乘以10,在计算完9的阶乘时a[0] = 2880,a[1]=36,因为362880*10 = (36*10+

精度计算-大数乘大数

精度计算                     大数乘大数 本算法是用来计算一个大数(现有的数据类型无法表示的数)乘以一个大数(现有的数据类型无法表示的数). 算法思路是把大数的每一位都当做一个字符放入一个字符数组中,再把乘数的各个位与被乘数的各个位从最高位依次相乘,将结果存放在一个二维数组res中.例如计算12*12,res[0][0] = 1,res[0][1] = 2,res[1][0] = 2,res[1][1] = 4,那么最终结果的数组s,s[0] = res[0][0]= 1,s

多精度计算备忘录之乘法 ------ 复杂度分析

多精度计算里,多精度乘法是其中最重要的运算之一,编写的多精度库(类)的其中一个重要效率标识就是其乘法的速度. 根据曾经写的大数类的记忆,简单记录下其中的一些技巧,以备查询. 一般的算法有如: 多精度乘法,所知的几个主要的优化方法有: 1:直接乘法. 2:comba乘法 3:Karatsuba乘法 4:toom_cook乘法 5:FFT乘法 6:FNT算法,或其他类似的有限域上对应类似的FFT算法 7:自己未曾理解的算法. 8:改进技巧, 1:直接乘法. a   b    c *         

精度计算-大数加大数

精度计算                大数加大数 本算法是用来计算一个大数(现有的数据类型无法表示的数)加上一个大数(现有的数据类型无法表示的数). 算法思路是把作为被加数和加数的大数的每一位都当做一个字符分别放入一个字符数组中,再把加数的各个位与被加数的各个位从最低位依次相加,将结果存放在一个字符指针中,最后再放入一个结果数组中. 下面是我的C语言实现过程 #include<stdio.h> #include<string.h> void add(char a[],char b

精度计算-大数乘小数

精度计算-大数乘小数 本算法是用来计算一个大数(现有的数据类型无法表示的数)乘以一个小数(10以内的数). 算法思路是把大数的每一位都当做一个字符放入一个字符数组中,再从最后一位开始于要乘的小数相乘并加上前一位的进位,如果有进位存入一个变量中,加到下一位的计算中去. 下面是我的C语言实现过程. int main() { char c[100] = "1231231231231231231231231231231232"; char t[101] ; int m = 10; mult(c

php的精度计算问题(bcadd和bcsub)

一.前言 我们在进行php开发的时候经常会遇到浮点型的问题,特别是涉及金额的部分,常常需要进行加减运算.当小数点的位数比较多的时候,往往容易犯一些很低级的错误.这里记录一下php的精度计算和封装的小demo. 二.关于php的高精度问题 1.概念解释 这篇文章的解释最清楚: php高精度计算问题 2.高精度数值对比大小问题 下面这篇文章讲的很好: 临时发一个项目遇到的PHP浮点计算问题 默认保留两位小数 bcadd(参数1,参数2,参数3) 参数1 和2 是要相加的参数 3是保留几位小数. 1.

BigDecimal工具类处理精度计算

1 /** 2 * Created by My_coder on 2017-07-27. 3 * 加减乘除计算工具类 4 */ 5 public class BigDecimalUtil { 6 private BigDecimalUtil() { 7 } 8 9 /** 10 * 加 11 */ 12 public static BigDecimal add(Double v1, Double v2){ 13 BigDecimal b1 = new BigDecimal(v1.toString

关于BigDecimal 的计算

BigDecimal 构造方式主要包括4种: 支持double.int.long等类型计算,废话少说,直接上代码 import java.math.BigDecimal; public class BigDecimalUtil{ //几种类型的声明 //String BigDecimal bd1 = new BigDecimal("11111"); //int BigDecimal bd2 = new BigDecimal(11111); //long BigDecimal bd3 =

PHP 精度计算引发的灾难性Bug

在维护一个比较老的金融项目时,发现精度的计算简单粗暴,先来看一下代码片段: if($accountInfo['account_money'] < $repayMoney ){ rollback(); return false; } 如上代码片段变量所示,上面的代码主要是比较帐户余额及还款数,两者均为双精度浮点数,稍作修改代码,让我们能看到一些输出才更直观 if($accountInfo['account_money'] < $repayMoney ){ echo "{$account