[ 형변환 ]
1. 숫자를 문자열로 바꾸기
int i = 639;
String str = String.valueOf ( i );
String str = Integer.toString ( i );
String str = i.toString ( );
int i = 639;
String str = String.valueOf ( i );
String str = Integer.toString ( i );
String str = i.toString ( );
2. 문자열을 숫자로 바꾸기
String str = "639";
int i = Integer.valueOf ( str ).intValue ( );
int i = Integer.parseInt ( str );
long i = Long.parseLong ( str )
double j = Double.valueOf ( str ).doubleValue ( );
3. 기타 형변환
Float를 Integer로 바꾸기
float f = 3.25;
int i = ( int ) f;
double d = ( double ) i; // 플로트형
Object를 int 타입으로 형변환 하기 ... 바로 안되므로 String으로 바꾼후 int로 형변환 한다.
Integer.parseInt ( vector.elementAt ( 0 ).toString () );
==============================================================================
제목 : [자바의 숫자표현] 어디까지 가능할까 !!!
글쓴이: 이원영(javaservice) 1999/03/03 13:14:50 조회수:472 줄수:100
글쓴이: 이원영(javaservice) 1999/03/03 13:14:50 조회수:472 줄수:100
1. int형으로 하면 얼마까지 나타낼 수 있는가?
int형으로 했을 경우 Test해 본 결과로는 21억까지 밖에 계산이 안되네요.
즉, 2,147,483,646 을 아래처럼 해 봤죠.
int result = Integer.parseInt("2147483646") + 1;
은 제대로 계산이 되는데,
int result = Integer.parseInt("2147483647") + 1;
의 값은 -2147483648이 나오네요...
2. 그럼 long형으로 하면 얼마까지 가능할까?
long형은 9,223,372,036,854,775,806 까지 됩니다.
'조' 다음이 '경'이니까 9백2십2경 3천조 까지구낭...
long result = Long.parseLong("9223372036854775806 ) + 1;
9223372036854775807 + 1 은 -9223372036854775808 로 나오네요.
[결론] 따라서 21억 이상을 표현하려면 long형이 필요함을 알수 있습니다.
만약 소수점 이하 자릿수도 표현해야 한다면 double형이 필요합니다.
double형으로 했을 경우도 반드시 만능이 아닙니다.
long형은 9,223,372,036,854,775,806 까지 됩니다.
'조' 다음이 '경'이니까 9백2십2경 3천조 까지구낭...
long result = Long.parseLong("9223372036854775806 ) + 1;
9223372036854775807 + 1 은 -9223372036854775808 로 나오네요.
[결론] 따라서 21억 이상을 표현하려면 long형이 필요함을 알수 있습니다.
만약 소수점 이하 자릿수도 표현해야 한다면 double형이 필요합니다.
double형으로 했을 경우도 반드시 만능이 아닙니다.
3. 그럼 자바의 최대 소수점 처리가 가능한 double형은 어디까지인가요?
1)소수 이하의 자리수를 유효숫자 2자리까지 필요하다면 그 수치는
70조(70,368,744,177,663.99) 까지 입니다.
아래와 같은 프로그램에서
import java.text.DecimalFormat;
DecimalFormat df = new DecimalFormat("#########################.00");
double d = new Double(src.getText()).doubleValue();
d += 0.01;
textfield.setText(df.format(d) );
70368744177663.99 + 0.01 = 70368744177664 로 제대로 계산되나
70368744177664.00 + 0.01 = 70368744177664.02 로 0.01의 오차가 발생합니다.
2)만약 double형으로 사용하되 소숫점 이하는 무시한다고 한다면
9천 7조(9,007,100,000,000,000) 까지만 + 1.0 을 했을 때 정확한 수치가 나옵니다.
3)만약 소수이하 세자리까지 필요하다면 어디까질까요?
8조 7천9백60억(8,796,093,022,207)까지네요.
8796093022207 + 0.001 = 8796093022207.001 로 정확하나
그 다음부턴 0.001의 차이가 납니다.
(NOTE: 심각하게 차이가 바로 발생하지는 않지만 위 수치 부터 덧셈이나 뺄셈이 약간의
오차를 보이기 시작합니다.)
[결론] 에궁 자바는 double외에는 없는데, 어떻하낭? 소수이하를 무시하면 9천 7조 까지만
계산이 정확하고, 소수 두자리 까진 70조가 넘어면 안되구, 소수 세째자리가진
8조7천억이 넘어면 안된다더라...
어쩌나...
그러나 어디까지라고는 꼭 집어 얘기하진 못하지만, 국방부 같이 몇 백억 단위는
long형과 double형만으로 계산으로 하여도 문제는 발생하지 않겠네요..
그러나 은행이나, 금융기관, 국가재정을 다루는 시스템을 꾸밀 때,
만약 그 시스템이 자바로 되어 있다면,
수치가 조단위를 를 넘어 갈 경우 long과 double형을 사용하면 계산이
틀려진다는 걸 꼭 기억하세요.
1)소수 이하의 자리수를 유효숫자 2자리까지 필요하다면 그 수치는
70조(70,368,744,177,663.99) 까지 입니다.
아래와 같은 프로그램에서
import java.text.DecimalFormat;
DecimalFormat df = new DecimalFormat("#########################.00");
double d = new Double(src.getText()).doubleValue();
d += 0.01;
textfield.setText(df.format(d) );
70368744177663.99 + 0.01 = 70368744177664 로 제대로 계산되나
70368744177664.00 + 0.01 = 70368744177664.02 로 0.01의 오차가 발생합니다.
2)만약 double형으로 사용하되 소숫점 이하는 무시한다고 한다면
9천 7조(9,007,100,000,000,000) 까지만 + 1.0 을 했을 때 정확한 수치가 나옵니다.
3)만약 소수이하 세자리까지 필요하다면 어디까질까요?
8조 7천9백60억(8,796,093,022,207)까지네요.
8796093022207 + 0.001 = 8796093022207.001 로 정확하나
그 다음부턴 0.001의 차이가 납니다.
(NOTE: 심각하게 차이가 바로 발생하지는 않지만 위 수치 부터 덧셈이나 뺄셈이 약간의
오차를 보이기 시작합니다.)
[결론] 에궁 자바는 double외에는 없는데, 어떻하낭? 소수이하를 무시하면 9천 7조 까지만
계산이 정확하고, 소수 두자리 까진 70조가 넘어면 안되구, 소수 세째자리가진
8조7천억이 넘어면 안된다더라...
어쩌나...
그러나 어디까지라고는 꼭 집어 얘기하진 못하지만, 국방부 같이 몇 백억 단위는
long형과 double형만으로 계산으로 하여도 문제는 발생하지 않겠네요..
그러나 은행이나, 금융기관, 국가재정을 다루는 시스템을 꾸밀 때,
만약 그 시스템이 자바로 되어 있다면,
수치가 조단위를 를 넘어 갈 경우 long과 double형을 사용하면 계산이
틀려진다는 걸 꼭 기억하세요.
4. 근데, java.math.BigDecimal 은 뭐하는 거예요?
java.math.BigInteger도 있던데?
import java.math.BigDecimal;
BigDecimal op1 = new BigDecimal("100000000000000000000000000000000000.01");
BigDecimal op2 = new BigDecimal("10002341234124000000000000000000.2134");
BigDecimal sum = op1.add(op2);
textArea.setText(sum.toString());
등과 같이 사용하는데, 아무리 큰 수 일지라도 완벽하게 계산해 냅니다.
java.math.BigInteger 는 정수형을 계산한다는 것을 제외하고 똑 같습니다.
java.math.BigInteger도 있던데?
import java.math.BigDecimal;
BigDecimal op1 = new BigDecimal("100000000000000000000000000000000000.01");
BigDecimal op2 = new BigDecimal("10002341234124000000000000000000.2134");
BigDecimal sum = op1.add(op2);
textArea.setText(sum.toString());
등과 같이 사용하는데, 아무리 큰 수 일지라도 완벽하게 계산해 냅니다.
java.math.BigInteger 는 정수형을 계산한다는 것을 제외하고 똑 같습니다.
[진짜 결론]
날로 통화화폐가치가 떨어 지는 요즘 조단위는 심심찮게 신문에 등장하는 수치입니다.
이젠 천문학적인 숫자가 아니라 일상적인 숫자로 되는 요즘 돈계산을 하실 때,
아무 생각없이 사칙연산을 할 것이 아니라 보다 유효자리숫자를 고려하여 연산을
생각하는 꼼꼼한 프로그래머가 됩시다.... ;
마지막으로 건의를 주신 이원경님께 감사드리며 반영하도록 해야 겠네요.
[PS] 자바의 Default Decimal 형은 float형이 아니라 double형입니다.
즉 float f = (float) 5.0; 등과 같이 cast연산자를 사용하는 반면에
double d = 5.0; 이렇게 사용할 수 있는 거죠.
구태여 자바에서 float형을 쓸 일은 없다고 보여집니다. 유효숫자 자리수만 낮아질 뿐이죠.
'Java' 카테고리의 다른 글
인수로 들어온 문자가 숫자인지 아닌지 체크하기 (0) | 2006.07.11 |
---|---|
[펌] java에 대한 모든것 (0) | 2006.07.11 |
Web Hacking 3탄 구멍난 자바스크립트 (0) | 2006.06.01 |
Web Hacking 2탄 파일조작 (0) | 2006.06.01 |
Web Hacking 1탄 SQL Injection (1) | 2006.06.01 |