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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
실수의 표현방식 - 부동소수점(IEEE 754)지수부 무한 소수, 혹은 엄청 긴 소수점을 가지는 실수는 오차를 낼 수 밖에 없습니다. 아래 부동소수점으로 표현하는 방식을 보면 알 수 있습니다. 소수점의 이동 칸 수 + bios => 지수부 지수부(8bit) 가수...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.