자바 의 정확 한 비 즈 니스 계산

4519 단어 자바UP
컴퓨터 가 계산 과정 에서 의 반올림 관계 로 인해 일반적인 계산 과 공정 계산 은 계산 이 정확 하지 않 은 상황 이 발생 할 수 있다. 이런 상황 은 이 두 가지 계산 에서 견 딜 수 있 을 지 모 르 지만 비 즈 니스 연산 에서 받 아들 일 수 없다. 재무 계산.

//import org.zym.arithutil.Arith;

public class FloatCalculation {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(0.05 + 0.01);
//		System.out.println(Arith.add(0.05,0.01));
		
		System.out.println(4.015 * 100);
//		System.out.println(Arith.mul(4.015,100));
	}

}

그 계산 결과:
인용 하 다.
0.060000000000000005
401.49999999999994
이것 은 분명히 받 아들 일 수 없 는 것 이다.
다음은 산술 류 도 구 를 사용 하여 이 문 제 를 해결 하 는 것 입 니 다. 기본 원칙 은 자바. math. BigDecimal 류 를 사용 하여 가감 곱 하기 연산 패 키 징 을 하 는 것 입 니 다.

package org.zym.arithutil;
import java.math.BigDecimal;

public class Arith{
    //        
    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();
    }
}

다음 코드 보기:

import org.zym.arithutil.Arith;

public class FloatCalculation {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(0.05 + 0.01);
		System.out.println(Arith.add(0.05,0.01));
		
		System.out.println(4.015 * 100);
		System.out.println(Arith.mul(4.015,100));

	}

}

비교 계산 결 과 는 다음 과 같다.
인용 하 다.
0.060000000000000005
0.06
401.49999999999994
401.5
만 족 스 러 운 효 과 를 얻 었 습 니 다. 다른 두 가지 계산 은 여러분 이 스스로 테스트 할 수 있 습 니 다. 그러면 정확 한 비 즈 니스 누가 계산 하 는 지 를 요구 하 는 문 제 를 해결 하고 정리 하여 여러분 과 자신 이 사용 하 는 데 편리 하도록 합 니 다.

좋은 웹페이지 즐겨찾기