2017-05-15 10 views
0

이중 값을 누락 된 값을 표시하는 미리 정의 된 상수와 비교하는 코드에서 작업하고 있습니다. 그들은 특정 요구 사항을 충족하지 않는 경우이 값이 (여기 input)를 변수에 할당하는 방식으로 사용됩니다Double # equals와 같은 double 상수와 scala를 비교하면 저장됩니까?

나중에 응용 프로그램의
val BAD = -9999.9 
val verified = if(isQualityOk(input)) input else BAD 

, 다시 그들이 좋은 또는 아닌지 확인되는 번호 :

if(!myNumber.equals(BAD)) { 
    // do something with it 
} 

나는, 따라서이되는 자신의 차의 절대 값을 비교하는 것이 좋습니다 일반적으로 오류로 인해 (유한 기계 정밀도를) 반올림의 "동일"을 사용하여 플로트/두 값을 비교하는 나쁜 생각이라고 알고 있어요 특정 한도 아래서

제 질문 : 위의 예에서 번호가있는 수학을 사용하지 않는 경우에도 이것이 필요합니까? 또는이 경우에 Double#equals 구현을 사용하는 것이 안전할까요?

답변

1

안전한 데이터 형식을 사용하는 일을 다시 배열 것 .

그러나 이것은 기능 프로그래밍에서 특수한 경우를 처리하는 방법이 아닙니다.

그것은 것 같은 뭔가를 아마 더 명시 다음 품질이 경우

val verified: Option[Double] = Some(input).filter(isQualityOk) 

그렇게 타입 시스템이 유효한 값을 가지고 확실하지 않은 사실을 알 수 있음 (이 None 될 것입니다 아닙니다).

일반적으로 f(d: Double): Tverified에 적용하고 verified.map(f)을 입력하면 Option[T]이되며 계속 진행합니다. 당신이 진정한 가치를 필요로 할 때마다

, 당신은 항상 verfied.getOrElse(BAD)을 수행하여 다시 Double을 얻을 수 있지만, 타입 시스템이 일부 오류를 방지 할 수 있도록, 가능한 한 오랫동안 None 같은 예외적 인 경우를 유지하는 것이 좋습니다.

+0

감사합니다. 이 기능이 작동하지 않는다는 것을 완전히 알고 있습니다. 기존 코드를 검토하고 있습니다. 내 예도 간소화되었지만 좋은/나쁜 두 가지 상수가 아닌 1 개 이상의 '플래그'가 있습니다. –

0

계산이 없으면 10 진수에서 2 진수로의 변환을 제외하고는 정밀도를 잃을 수있는 곳이 없습니다. 당신은 잘되어야합니다.

두말할 몇 가지 버전의 코드는 사용자가 언급 한 응답으로 인해 미묘한 버그가 발생합니다. 따라서이 코드를 실행 가능한 코드로 옮기면 장기적으로는, 나는 당신이 당신의 Double의에서 부동 소수점 연산을 설정하지 않으면 괜찮을한다 (verified 소리가 아니, Boolean해야처럼?)