2008-11-06 10 views
2

저는 java를 사용하고 "double"데이터 유형을 참조합니다. 코드를 짧게 유지하기 위해 코드에서 표준 입력에서 값을 두 배로 읽습니다 (BigInteger와 같은 것을 사용하지만 지금은 불가능합니다).부동 소수점 반올림 감지

나는 사용자의 두 배 값을 얻을 것으로 예상하지만, 때로는 같은 입력 것들이 있습니다 : 나는 두 번에 대한 정확한 표현을 넘어 생각하고의를 얻을 수 999999999999999999999999999.9999999999 은 1.0E27 (아마)로 반올림.

특정 값이 이중으로 정확하게 표현 될 수 없거나 반올림이 필요하다는 것을 감지하는 방법에 대한 몇 가지 지침을 얻고 싶습니다. (따라서 그 값이나 다른 그러한 동작을 거부 할 수 있습니다).

당신에게 인간에 의해 입력

답변

4

대부분의 값이 이중으로 정확히 표현할 수 없게됩니다 대단히 감사합니다.

예를 들어, 사용자가 0.1을 입력하지 못하도록 하시겠습니까? 그것은 정확하게 이중으로 표현할 수 없습니다.

오류의 규모를 찾으려면, 당신이 뭔가를 할 수 있습니다 :

BigDecimal userAsDecimal = new BigDecimal(userInput); 
double userAsDouble = double.parseDouble(userInput); 
BigDecimal doubleToDecimal = new BigDecimal(userAsDouble); 
BigDecimal error = userAsDecimal.subtract(userAsDouble).abs(); 

그런 다음 "오류"참을 작은 있는지 확인합니다.

+0

실제로 올바른 것입니다. 좀 더 구체적으로 말하면, 항상 10 자리 숫자의 정밀도로 양수를 얻습니다. 따라서 내 요구 사항은 숫자의 전체 부분을 제한하여 반올림을 일으키지 않을 것입니다. – cupu

+0

나는 여전히 ' 꽤 이해하지 못한다. 실제로 정수 만 얻을 수 있다는 것을 의미합니까? 그렇다면 길게 사용하십시오. 그렇지 않다면, 다시 잃어 버렸습니다 ... –

+0

요청을 공식화하는 데 약간의 문제가 있습니다. 감사합니다 (특히) 그리고 다른 모든 사람들은 내 경우에 사용하는 것이 좋지 않습니다. 나는 조금 동안 불평하고 있었다 :). – cupu

2
double orig = GetSomeDouble(); 
double test1 = orig - 1; 
if (orig == test1) 
    SomethingIsWrong(); 
double test2 = test1 + 1; 
if (orig != test2) 
    SomethingIsWrong(); 
+0

발췌 해 주셔서 감사합니다. 그것은 말하기 쉽고 편리한 학습 경험입니다. 내가 무한 값을 제거 할 것이기 때문에 아마 그것을 사용하지 않을 것이다. 그러나 그것은 나의 문제 다. :) 다시 한 번 감사합니다 – cupu

1

당신은 아주 드물게 사용자가 두 번 완벽하게 표현할 수 번호를 입력 수 없다, 당신이 요구하고있는 방법으로 정확하게 뭔가를 저장하는 더블을 사용할 수 없습니다, 그러나 그것은 단지 우연의 일치 일 것이다. 정확한 숫자를 저장해야하는 경우 조작을 수행 할 필요가없는 한 문자열을 사용할 수 있습니다. 그 이상의 것을 필요로한다면 그 종류의 정확한 수학을 위해 만들어진 라이브러리가있을 것입니다.

+0

정확함, 고맙습니다. – cupu