数字精确运算BigDecimal常用方法

原创 2015年07月11日 07:24:15
import java.math.BigDecimal; 

public class Arith { 

/** 
* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 
* 确的浮点数运算,包括加减乘除和四舍五入。 
*/ 
//默认除法运算精度 
private static final int DEF_DIV_SCALE = 10; 
    
//这个类不能实例化 
private Arith(){ 


    /** 
     * 提供精确的加法运算。 
     * @param v1 被加数 
     * @param v2 加数 
     * @return 两个参数的和 
     */ 
    public static double add(double v1,double v2){ 
        BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
        BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
        return b1.add(b2).doubleValue(); 
    } 
    /** 
     * 提供精确的减法运算。 
     * @param v1 被减数 
     * @param v2 减数 
     * @return 两个参数的差 
     */ 
    public static double sub(double v1,double v2){ 
        BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
        BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
        return b1.subtract(b2).doubleValue(); 
    } 
    /** 
     * 提供精确的乘法运算。 
     * @param v1 被乘数 
     * @param v2 乘数 
     * @return 两个参数的积 
     */ 
    public static double mul(double v1,double v2){ 
        BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
        BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
        return b1.multiply(b2).doubleValue(); 
    } 

    /** 
     * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 
     * 小数点以后10位,以后的数字四舍五入。 
     * @param v1 被除数 
     * @param v2 除数 
     * @return 两个参数的商 
     */ 
    public static double div(double v1,double v2){ 
        return div(v1,v2,DEF_DIV_SCALE); 
    } 

    /** 
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 
     * 定精度,以后的数字四舍五入。 
     * @param v1 被除数 
     * @param v2 除数 
     * @param scale 表示表示需要精确到小数点以后几位。 
     * @return 两个参数的商 
     */ 
    public static double div(double v1,double v2,int scale){ 
        if(scale<0){ 
            throw new IllegalArgumentException( 
                "The scale must be a positive integer or zero"); 
        } 
        BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
        BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); 
    } 

    /** 
     * 提供精确的小数位四舍五入处理。 
     * @param v 需要四舍五入的数字 
     * @param scale 小数点后保留几位 
     * @return 四舍五入后的结果 
     */ 
    public static double round(double v,int scale){ 
        if(scale<0){ 
            throw new IllegalArgumentException( 
                "The scale must be a positive integer or zero"); 
        } 
        BigDecimal b = new BigDecimal(Double.toString(v)); 
        BigDecimal one = new BigDecimal("1"); 
        return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); 
    } 
    
   /** 
    * 提供精确的类型转换(Float) 
    * @param v 需要被转换的数字 
    * @return 返回转换结果 
    */ 
    public static float convertsToFloat(double v){ 
    BigDecimal b = new BigDecimal(v); 
    return b.floatValue(); 
    } 
    
    /** 
* 提供精确的类型转换(Int)不进行四舍五入 
* @param v 需要被转换的数字 
* @return 返回转换结果 
*/ 
public static int convertsToInt(double v){ 
BigDecimal b = new BigDecimal(v); 
    return b.intValue(); 


/** 
* 提供精确的类型转换(Long) 
* @param v 需要被转换的数字 
* @return 返回转换结果 
*/ 
public static long convertsToLong(double v){ 
BigDecimal b = new BigDecimal(v); 
    return b.longValue(); 


/** 
* 返回两个数中大的一个值 
* @param v1 需要被对比的第一个数 
* @param v2 需要被对比的第二个数 
* @return 返回两个数中大的一个值 
*/ 
public static double returnMax(double v1,double v2){ 
BigDecimal b1 = new BigDecimal(v1); 
BigDecimal b2 = new BigDecimal(v2); 
    return b1.max(b2).doubleValue(); 


/** 
* 返回两个数中小的一个值 
* @param v1 需要被对比的第一个数 
* @param v2 需要被对比的第二个数 
* @return 返回两个数中小的一个值 
*/ 
public static double returnMin(double v1,double v2){ 
BigDecimal b1 = new BigDecimal(v1); 
BigDecimal b2 = new BigDecimal(v2); 
    return b1.min(b2).doubleValue(); 


/** 
* 精确对比两个数字 
* @param v1 需要被对比的第一个数 
* @param v2 需要被对比的第二个数 
* @return 如果两个数一样则返回0,如果第一个数比第二个数大则返回1,反之返回-1 
*/ 
public static int compareTo(double v1,double v2){ 
BigDecimal b1 = new BigDecimal(v1); 
BigDecimal b2 = new BigDecimal(v2); 
    return b1.compareTo(b2); 



版权声明:本文为博主http://www.feixueteam.net原创文章,未经博主允许不得转载。

相关文章推荐

数字精确运算BigDecimal常用方法

import java.math.BigDecimal;  public class Arith {  /**  * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精...

数字精确运算BigDecimal长常用用法

import java.math.BigDecimal;  public class Test {  /**  * 因为Java的简单类型不可以精确的对浮点数进行运算,这个工具类提供精 ...

计算金额 财务计算 精确运算 BigDecimal用法详解

一、简介 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效 位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或...

91.使用BigDecimal进行精确运算

使用BigDecimal进行精确运算   首先我们先来看如下代码示例: 1 public class Test_1 { 2 public static void main(...

java BigDecimal实现精确加减乘除运算

java.math.BigDecimal.BigDecimal一共有4个够造方法,让我先来看看其中的两种用法: 第一种:BigDecimal(double val) 将double转换为BigDec...

使用BigDecimal进行精确运算

首先我们先来看如下代码示例: public class Test_1 { public static void main(String[] args) { System.out.print...
  • chenssy
  • chenssy
  • 2012年09月09日 10:15
  • 4559

BigDecimal进行精确运算(实现加减乘除运算)

今天在做float小数加减时,遇到如下问题:public class Test { public static void main(String[] args) { Syste...

BigInteger类,BigDecimal类,超大数字的运算与精度

BigInteger类   可以让超过Integer范围内的数据进行运算   不可变的任意精度的整数。  java.lang.Object  ——java.lang.Number ——————java...
  • uotail
  • uotail
  • 2017年05月07日 22:34
  • 105

java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定

一、 计算机的小数计算一定范围内精确,超过范围只能取近似值: 计算机存储的浮点数受存储bit位数影响,只能保证一定范围内精准,超过bit范围的只能取近似值。 java中各类型的精度范围参...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数字精确运算BigDecimal常用方法
举报原因:
原因补充:

(最多只允许输入30个字)