BigDecimal 자습 노트

6433 단어 BigDecimal
먼저 아래의 이 예를 보아라.
public class DoubleTest1 {
	public static void main(String[] args) {
		System.out.println("0.05+0.01="+(0.05+0.01));
		System.out.println("1.0-0.42="+(1.0-0.42));
		System.out.println("4.015*100="+(4.015*100));
		System.out.println("123.3/100="+(123.3/100));
	}
}
실행 결과:
0.05+0.01=0.060000000000000005
1.0-0.42=0.5800000000000001
4.015*100=401.49999999999994
123.3/100=1.2329999999999999
 
위의 예는
java의 더블 형식은 정밀도를 잃어버릴 수 있습니다. 특히 산술 연산을 할 때 이런 상황이 발생하기 쉽습니다.(자바뿐만 아니라 많은 언어에 이런 문제가 존재한다)
프로그램이 new BigDecimal(0.1)을 사용하여 BigDecimal 대상을 만들 때, 그 값은 0.1이 아니라, 실제로는 0.1000000000000000005543243224와 같다.이는 0.1이 더블 부동점수로 정확하게 표현되지 않기 때문에 빅데시밀 구조기에 전송되는 값이 0.1과 꼭 같지 않을 것이다. (표면적으로는 이 값과 같지만)
 
BigDecimal (String val) 구조기를 사용하면 결과를 예측할 수 있습니다. 예를 들어 new BigDecimal ("0.1") 은 BigDecimal을 만들 것입니다. 이것은 예상한 0.1과 같기 때문에, 보통 String 기반 구조기를 우선적으로 사용하는 것을 권장합니다.
 
만약 Double 부동점수를 BigDecimal 구조기의 매개 변수로 사용해야 할 때, Double 부동점수를 구조기의 매개 변수로 직접 BigDecimal 대상을 만들지 말고 BigDecimal을 통과해야 한다.BigDecimal 객체를 작성하기 위한 정적 방법(double value)
 
import java.math.BigDecimal;
public class BigDecimalTest {
	public static void main(String[] args) {
		BigDecimal f1 = new BigDecimal("0.05");
		BigDecimal f2 = BigDecimal.valueOf(0.01);
		BigDecimal f3 = new BigDecimal(0.05);
		 
		System.out.println("  String  BigDecimal     :");
		System.out.println("0.05 + 0.01 = " + f1.add(f2));
		System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
		System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
		System.out.println("0.05 / 0.01 = " + f1.divide(f2));
		 
		System.out.println("  double  BigDecimal   :");
		System.out.println("0.05 + 0.01 = " + f3.add(f2));
		System.out.println("0.05 - 0.01 = " + f3.subtract(f2));
		System.out.println("0.05 * 0.01 = " + f3.multiply(f2));
		System.out.println("0.05 / 0.01 = " + f3.divide(f2));
	}
}

 
실행 결과:
String을 BigDecimal 작성기 매개변수로 사용하려면 다음과 같이 하십시오.
0.05 + 0.01 = 0.06
0.05 - 0.01 = 0.04
0.05 * 0.01 = 0.0005
0.05/0.01 = 5
Double을 BigDecimal 구조자로 사용하려면 다음과 같이 하십시오.
0.05 + 0.01 = 0.06000000000000000277555756156289135105907917022705078125
0.05 - 0.01 = 0.04000000000000000277555756156289135105907917022705078125
0.05 * 0.01 = 0.0005000000000000000277555756156289135105907917022705078125
0.05/0.01 = 5.000000000000000277555756156289135105907917022705078125
 
금융 항목 중 금액에 대한 정확도가 높아야 한다
 
package hb.bigdecimal;
import java.math.BigDecimal;

public class BigDecimalDemo {

	public static void main(String[]args){
		double v1 = 3.5;
		double v2 = 0.7;
//		BigDecimal result = add(v1, v2);
//		BigDecimal result = sub(v1, v2);
//		BigDecimal result = mul(v1, v2);
		BigDecimal result = div(v1, v2);
		System.out.println(result);
		
		BigDecimal a = new BigDecimal(998.01);  
		BigDecimal a1 = BigDecimal.valueOf(998.01);  
		BigDecimal b=new BigDecimal("100");  
		System.out.println(a.multiply(b));  
		System.out.println(a1.multiply(b));  //     
		  
		BigDecimal aa = new BigDecimal(135.95);  
		BigDecimal aa1 = new BigDecimal("135.95");  
		BigDecimal bb=new BigDecimal("100");  
		System.out.println(aa.multiply(bb));  
		System.out.println(aa1.multiply(bb));   //     
		  
		  
		BigDecimal test = new BigDecimal(4.015);  
		BigDecimal test2 = BigDecimal.valueOf(4.015);  
		BigDecimal test1 = new BigDecimal(100);  
		System.out.println(test.multiply(test1));
		System.out.println(test2.multiply(test1)); //     
		
		BigDecimal aa11 = new BigDecimal(135.95);  
		BigDecimal aa12 = new BigDecimal("135.95");  
		BigDecimal bb1=new BigDecimal("100");  
		BigDecimal result1=aa11.multiply(bb1); 
		BigDecimal result2=aa12.multiply(bb1);  //     
		//   BigDecimal      2 ,                       ,              ,         
		System.out.println(result1.setScale(2,BigDecimal.ROUND_HALF_EVEN));
		System.out.println(result2.setScale(2,BigDecimal.ROUND_HALF_EVEN));
		
		
	}
	
	/**
	 *            
	 *                ,       10 ,          
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static BigDecimal div(double v1,double v2){
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		//13             
		return b1.divide(b2, 13, BigDecimal.ROUND_HALF_UP);
	}
	
	/**
	 *      
	 * @param v1
	 * @param v2
	 * @return
	 */
	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);
	}
	
	/**
	 *             
	 * @param v1
	 * @param v2
	 * @return
	 */
	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);
	}
	
	/**
	 *        
	 * @param v1
	 * @param v2
	 * @return
	 */
	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);
	}
}

실행 결과:
5.0000000000000
99800.999999999999090505298227071762084960937500
99801.00
13594.99999999999886313162278383970260620117187500
13595.00
401.49999999999996802557689079549163579940795898437500
401.500
13595.00
13595.00
 

좋은 웹페이지 즐겨찾기