2011-09-12 6 views
0

플로트 타입 데이터의 유효성을 검사하고 싶습니다. 나는 위의 규칙은 데이터 형식은 999.99java에서 특정 형식에 대해 float의 유효성을 검사하는 방법은 무엇입니까?

1234.56의 예상 검증해야 나타냅니다

int precision1 = 3; 
int precision2 = 2; 

로 정의 된 규칙을 얻을, 위의 규칙에서 실패한다. 또한 위의 규칙에서 float 123.456에 대한 유효성 검사가 실패합니다. 123.33의 예상 유효성 검증이 성공해야합니다.

의견이 있으면 확인 절차에 착오가 있습니다.

감사합니다,

Kaygee
+0

나는 그 규칙이 의미가 있거나 "정밀도"라는 단어의 일반적인 사용을 반영한다고 주장하지는 않지만 [100 * x]가 [10000, 100000] 범위의 정수가되게하려는 것 같습니다. . –

+0

문자열을 가져 가고 있습니까? 왜냐하면 이미 플로트가 있다면 당신은 망했다. – NullUserException

+0

[무엇을 시도해 봤습니까?] (http://mattgemmell.com/2008/12/08/what-have-you-tried/) –

답변

2

신속하고 더러운 :

int precision1 = 3; 
    int precision2 = 2; 
    float var = 123.12f; 
    String varStr = String.valueOf(var); 
    if (varStr.length() == (precision1 + precision2 + 1) && varStr.indexOf(".") == precision1) { 
     System.out.println(true); 
    } else { 
     System.out.println(false); 
    } 
+0

그레그에게 감사드립니다. var 값이 12345.66789f 인 경우 varStr은 12345.688이되고 반올림은 느슨합니다. 반올림을 풀지 않는 방법은 무엇입니까? – Kaygee

+0

NullUserException - 당신이 이미 float을 가지고 있다면 당신은 float의 내부 표현이 거의 항상 문자열 입력의 근사치이므로 운이 없다고 말했습니다. – extraneon

+0

하지만 왜 반올림을 신경 쓰나요? 데이터가 테스트에 실패했습니다. 더 긴 "precision2"값을 처리하기 위해 유연해야합니까? 단 2 자릿수의 반올림 문제는 발생하지 않습니다. – Greg

1

사용자가 문자열을 입력,이 떠있는 곳 변환, 당신은 플로트를 확인하려고합니다. 그렇게 할 수는 없습니다.

float의 문자열 표현은 사람의 인공물입니다. 게다가, float은 변환 된 String의 값을 근사치로 (매우 가깝게) 만 경향이 있습니다.

정밀도를 검증하려면 유일한 방법은 사용자 입력 문자열의 유효성을 검사하는 것입니다. 정밀도를 유지하려면 문자열처럼 저장하십시오.

이 필요하면 숫자를 계산하십시오 (예 : BigDecimal). 주어진 정확도를 유지하도록 설계되었습니다 (재무 계산에 중요). 그것들은 입니다. 매우 좋은과 작동하지만, 정확한 비 정수 값을 원한다면 지불해야하는 가격입니다.

편집

을 BigDecimal을 사용하는 방법.

BigDecimal b1 = new BigDecimal("1234.23"); 
System.out.println(b1 + " scale was " + b1.scale()); 2 
BigDecimal b2 = new BigDecimal("1234.523536223"); 
System.out.println(b2 + " scale was " + b2.scale()); // 9 

눈금을 사용하여 "정밀도"를 테스트 할 수 있습니다. b1.scale() == 2 || b1.scale() == 3 => 유효합니다.

+0

정밀도를 강조하기 위해 BigDecimal을 upvoted했습니다. BigDecimal에 큰 (> 7 소수) 실수를 삽입해도 오류가 발생합니다. 7 자리 이상의 정밀도가 필요한 경우 데이터를 String 또는 Double 형식으로 가져 와서 BigDecimal ... BigDecimal을 String으로 변환하고 패턴 일치를 수행 할 수 있습니다. – Greg

+0

@ 그렉 거기에 7 소수 자리 부동과 같은 것은 정말로 없습니다. BigDecimals (double) 생성자를 참조하십시오. 그러나 BigDecimal에 대한 몇 가지 추가 사용법 주석을 추가 할 것입니다. – extraneon

+0

나는 당신이 이상한 결과를 얻으려고 7 자리가 넘는 부동 소수점을 보낼 경우를 의미합니다. float 값에 대한 생성자에 123.123456789123456f를 넣는 것 ... 그것은 변환에 의해 남용됩니다. – Greg

관련 문제