Java中BigDecimal类的准确四则运算东西类ArithITeye - 娱乐之横扫全球

Java中BigDecimal类的准确四则运算东西类ArithITeye

2019-01-12 19:00:36 | 作者: 天蓉 | 标签: 准确,运算,需求 | 浏览: 401

在《Effective   Java》这本书中也说到这个准则,float和double只能用来做科学核算或者是工程核算,在商业核算中咱们要用java.math.BigDecimal

运用BigDecimal而且必定要用String来够造。   
可是想像一下吧,假如咱们要做一个加法运算,需求先将两个浮点数转为String,然后够形成BigDecimal,在其中一个上调用add办法,传入另一个作为参数,然后把运算的成果(BigDecimal)再转化为浮点数。你可以忍耐这么烦琐的进程吗?下面咱们供给一个东西类Arith来简化操作。它供给以下静态办法,包含加减乘除和四舍五入:   
public   static   double   add(double   v1,double   v2)   
public   static   double   sub(double   v1,double   v2)   
public   static   double   mul(double   v1,double   v2)   
public   static   double   div(double   v1,double   v2)   
public   static   double   div(double   v1,double   v2,int   scale)   
public   static   double   round(double   v,int   scale)  

import java.math.BigDecimal; 
 * 进行BigDecimal目标的加减乘除,四舍五入等运算的东西类 
 * @author ameyume 
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); 
} 

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章