Java Double型データ演算ツール(BigDecimal)

5772 ワード

説明:Javaがjava.mathパッケージで提供するAPIクラスBigDecimalは、16ビットを超える有効ビットの数を正確に演算するために使用されます.デュアル精度浮動小数点型変数doubleは16ビット有効数を処理できます.実際の応用では,より大きいまたはより小さい数の演算と処理が必要である.floatとdoubleは科学計算またはエンジニアリング計算にしか使用できません.ビジネス計算ではjava.math.BigDecimalを使用します.BigDecimalはオブジェクトを作成します.従来の+、-、*、/などの演算子を使用してオブジェクトを直接数学的に演算することはできません.対応するメソッドを呼び出す必要があります.メソッドのパラメータもBigDecimalのオブジェクトでなければなりません.コンストラクタは、オブジェクト、特にパラメータ付きオブジェクトの作成に特化したクラスの特殊な方法です.    1、コンストラクタの説明        BigDecimal(int)                パラメータで指定した整数値を持つオブジェクトを作成します.        BigDecimal(double)         パラメータで指定した二重精度値を持つオブジェクトを作成します.        BigDecimal(long)             パラメータで指定した長さの整数値を持つオブジェクトを作成します.        BigDecimal(String)          パラメータで指定された文字列で表される数値を持つオブジェクトを作成します.    2、方法説明        add(BigDecimal)            BigDecimalオブジェクトの値を加算し、そのオブジェクトを返します.        subtract(BigDecimal)     BigDecimalオブジェクトの値を減算し、そのオブジェクトを返します.        multiply(BigDecimal)      BigDecimalオブジェクトの値を乗算し、そのオブジェクトを返します.        divide(BigDecimal)         BigDecimalオブジェクトの値を除いて、このオブジェクトを返します.        toString()                        BigDecimalオブジェクトの数値を文字列に変換します.        doubleValue()                 BigDecimalオブジェクトの値を二重精度で返します.        floatValue()                     BigDecimalオブジェクトの値を単精度で返します.        longValue()                     BigDecimalオブジェクトの値を長い整数で返します.        intValue()                        BigDecimalオブジェクトの値を整数で返します.    3、パッケージの工具類
package gsau

/**
 * @ Description:  Double       
 * @ Date: 2019/11/25 10:27
 * @ Author: wgq
 * @ Version: 1.0
 */
class ArithUtils {
    private static final int DEF_DIV_SCALE = 2;                     //        
    private static final int DEF_MULTIPLY_SCALE=2                   //         
    private static final int DEF_SUB_SCALE=2                        //        
    private static final int DEF_ADD_SCALE=2                        //        
    //        
    private Arith(){
    }
    /**
     * @ Description:            
     * @ Date: 2019/11/25 16:42
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal convert(Object v1,int scale){
        BigDecimal b1 = new BigDecimal(Double.toString(v1)).setScale(scale,BigDecimal.ROUND_HALF_UP);
        return b1.longValue();
    }
    /**
     * @ Description:          。
     * @ param v1    
     * @ param v2   
     * @ return       
     * @ Date: 2019/11/25 10:33
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal add(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).setScale(DEF_ADD_SCALE,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
     * @ Description:          。
     * @ param v1    
     * @ param v2   
     * @ return       
     * @ Date: 2019/11/25 10:32
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal sub(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).setScale(DEF_SUB_SCALE,BigDecimal.ROUND_HALF_UP).longValue();
    }
    /**
     * @ Description:           。          
     * @ param v1    
     * @ param v2   
     * @ param scale    
     * @ return       
     * @ Date: 2019/11/25 10:40
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal mul(double v1,double v2,int scale){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).setScale(scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
     * @ Description:          。          
     * @ param v1    
     * @ param v2   
     * @ return       
     * @ Date: 2019/11/25 10:32
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal mul(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).setScale(DEF_MULTIPLY_SCALE,BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * @ Description:   (  )       ,          ,        2 ,         。
     * @ param v1    
     * @ param v2   
     * @ return       
     * @ Date: 2019/11/25 10:31
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal div(double v1,double v2){
        return div(v1,v2,DEF_DIV_SCALE);
    }

    /**
     * @ Description:   (  )       。          , scale      ,         。
     * @ param v1    
     * @ param v2   
     * @ param scale                 。
     * @ return       
     * @ Date: 2019/11/25 10:31
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal 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();
    }
    /**
     * @ Description:                。
     * @ param v          
     * @ param scale         
     * @ return         
     * @ Date: 2019/11/25 10:33
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal 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();
    }
}