공부/JAVA

자바 parseDouble 사용 중 주의할 점 - double형 지수 사용 안하기

JangGiraffe 2019. 7. 12. 22:22

안녕하세요, 장지랩입니다.

오늘은 회사에서 사수분이 알려준 주의할 점에 대해 공유하려고 해요.

자바 참조형변수(referrence Type) Double의 메서드인 parseDouble사용 중 주의할 점에 대해 알아보려고 합니다. 

parseDouble은 String타입의 문자열에 대해 double(기본형 변수-primitive Type,실수)으로 바꿔주는 기본 메서드인데요 

사용법은 아래와 같이 간단합니다. 

Double.parseDouble(String);

 

#다만 주의할 점이 있습니다.

Double.parseDouble로 String을 double로 변환하고, 출력해보면 순수 숫자가 아닌 알파벳과 함께 표기되는걸 볼 수 있습니다. 아래처럼요.

		String strNum  = "123456789.123";
		String strNum2 = "123456780.111";
		
		double dNum1 = Double.parseDouble(strNum);
		double dNum2 = Double.parseDouble(strNum2);
		
		System.out.println("String Type : "+strNum + "\tparseDouble : "+dNum1);
		
		System.out.println("String Type : "+strNum2+"\tparseDouble : "+dNum2);

결과 .. 지수로 표현이 되네요
String Type : 123456789.123 parseDouble : 1.23456789123E8
String Type : 123456780.111 parseDouble : 1.23456780111E8

이 상태에서 dNum1과 dNum2를 빼주면 결과는 어떻게 나올까요?

9.012가 나오는지 한번 찍어봤습니다.

System.out.println(dNum1-dNum2);

결과. 9.011999994516373

이런 예상하지 못한 결과는 시스템에 치명적인 오류를 불러 일으킨다던지, 매출등에 타격을 줄 수 있습니다.
(EX_미국,중국등의 화폐의 경우 소숫점을사용하기 때문에 문제가 생길 수 있다.)

#해결책

이를 해결하기 위해선 NumberFormat class의 setGroupingUsed(boolean) 메소드를 사용해야 합니다.

setGroupingUsed라는 메소드는 해당 숫자 포멧을 사용하는지 안하는지를 설정해주는 메소드로 매개변수에 false를 넣어주면 더이상 double에 지수표현을 사용하지 않게 됩니다.

사용법은 아래와 같습니다.

		NumberFormat format = NumberFormat.getInstance();
		
		format.setGroupingUsed(false);

		System.out.println("NumberFormat사용 1 : " + format.format(dNum1));
		System.out.println("NumberFormat사용 2 : " + format.format(dNum2));
		String result = format.format(dNum1-dNum2);
		System.out.println(result);

#결과

NumberFormat사용 1 : 123456789.123
NumberFormat사용 2 : 123456780.111
9.012

예상했던 결과가 나왔습니다.

 

전체소스와 /*출력내용*/을 마지막으로 포스팅을 마치겠습니다.

		String strNum  = "123456789.123";
		String strNum2 = "123456780.111";
		
		double dNum1 = Double.parseDouble(strNum);
		double dNum2 = Double.parseDouble(strNum2);
		
		System.out.println("String Type : "+strNum + "\tparseDouble : "+dNum1);
		
		System.out.println("String Type : "+strNum2+"\tparseDouble : "+dNum2);
		
		System.out.println(dNum1-dNum2);
		
		NumberFormat format = NumberFormat.getInstance();
		
		format.setGroupingUsed(false);

		System.out.println("NumberFormat사용 1 : " + format.format(dNum1));
		System.out.println("NumberFormat사용 2 : " + format.format(dNum2));
		String result = format.format(dNum1-dNum2);
		System.out.println(result);
/*
String Type : 123456789.123 parseDouble : 1.23456789123E8 
String Type : 123456780.111 parseDouble : 1.23456780111E8 
9.011999994516373 
NumberFormat사용 1 : 123456789.123 
NumberFormat사용 2 : 123456780.111 
9.012 
*/

 

 

 

반응형