>

따라서 두 가지 다른 쿼리가 있으며 둘 다 기준으로 float가 있습니다. 하나는 필요한 경우 아무 것도 반환하지 않고 다른 하나는 올바른 값을 반환합니다.

SELECT *
FROM filters 
WHERE hole = 0.7

단지 반환

SELECT *
FROM filters 
WHERE ek = 66

반품

'143987', '1', '14', '45', '0.7', '66', '0'

예상 한대로 0.7입니다.

그러나 다음

SELECT *
FROM needles 
WHERE needle_dia = 2.5

반품

'2', 'H1004', '300', '2.5', '2040173', '2040177'

둘 다 정확히 같은 유형인지 확인했습니다. 서명되지 않은 FLOAT, 널이 아닌 기본 표현식 NULL.

이유가있을 수 있습니까?

FLOAT 대신 DECIMAL을 사용할 수있는 얼굴을 알고 있지만 피하는 것이 좋습니다.


  • 답변 # 1

    부동 소수점 넘버링 시스템은 비 연속적이고 부정확하며 특정 값을 정확하게 표현할 수 없기 때문에 (예 : 0.7) 부동 소수점 값은 평등을 위해 비교해서는 안됩니다. 적절한 오류 값으로 대괄호로 묶어 항상 BETWEEN 식을 사용해야합니다.

    WITH cteEpsilon AS (SELECT 0.0001 AS EPSILON FROM DUAL)
    SELECT *
      FROM filters f
      CROSS JOIN cteEpsilon e
      WHERE 0.7 BETWEEN f.hole - e.EPSILON
                    AND f.hole + e.EPSILON
    
    

    질문에서 언급했듯이 DECIMAL과 같은 정확한 숫자 유형을 사용하는 것이 더 좋습니다.

    <시간>

    "무엇?!?" "그것을 증명하십시오 !!!"

    좋아요, 충분히 공평합니다. 간단한 작은 프로그램을 가지고 몇 개의 부동 소수점 상수를 선언하고 비교해 봅시다 :

    #include <stdio.h>
    float  f = 0.7;
    double d = 0.7;
    int main()
      {
      if(f == d)
        printf("Equal\n");
      else
        printf("Not equal\n");
      printf("f = %60.50f\nd = %60.50f\n", f, d);
      }
    
    

    이제 숨겨 지거나 숨겨진 상자를 찾지 않고도 출력물을 예측하고 종이에 예측을 적어 넣습니다.

    완료 했습니까? 승인. 컴파일하고 실행할 때 위의 내용은 다음과 같습니다.

      

    같지 않다  
     f = 0.69999998807907104492187500000000000000000000000000  
     d = 0.69999999999999995559107901499373838300000000000000

    맞습니다. 여기에 0.7로 지정된 두 상수가 있고 서로 같지 않습니다.

    여기서 문제는 선택한 정밀도에 관계없이 0.7을 IEEE-754 부동 소수점 값으로 정확하게 표현할 수 없다는 것입니다. 여기서 상수는 다른 정밀도를 갖습니다. 하나는 4 바이트 부동 소수점 값입니다 (유형 float ). ), 두 번째는 "배정 밀도"부동 소수점 값 ( double 유형)입니다. ) 및 각 값의 정밀도가 다르기 때문에 결과 값이 다릅니다. (지금 방 뒤의 똑똑한 사람은 "그렇습니다.하지만 정수를 사용하면 항상 정확하게 비교할 것입니다."라고 말하고 있습니다. 아니, 똑똑한 사람-상수를 1234567890으로 변경하고 어떤 일이 일어나는지보십시오.) 0.7에 가능한 가장 가까운 근사값을 생성하는 것이 최선이지만 근사값은 여전히 ​​0.7과 같지 않으며 값을 저장하는 데 사용되는 변수의 정밀도와 다릅니다. 그렇다고 IEEE-754가 고장 나거나 컴퓨터가 고장 났거나 우주에 Candyland로 이끄는 비밀 함정이 있다는 의미는 아닙니다. (Drat! :-) 부동 소수점 숫자가 언뜻보기에 제안한 것보다 훨씬 더 복잡하다는 것을 의미합니다. 이 문제가 발생하는 이유를 파악하려면 다음을 읽어보십시오.

    모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 사항

    부동 소수점 Gui.de

    부동 소수점 숫자가 정확하지 않은 이유,

    부동 소수점 수 : 문제 및 제한 사항

    부동 소수점 숫자가 정밀도를 잃는 이유

  • 답변 # 2

    흠, 데이터베이스에서 잘못 해석되었을 수 있습니다.

    다음과 같은 쿼리를 시도하십시오 :

    SELECT *
    FROM filters 
    WHERE hole LIKE '0.7'
    
    

    문자열로 보이면 독립적이어야합니다.

  • 이전 android - NETStandard 20을 사용하는 Xamarin Forms에서 색조 크기가 올바르지 않습니다
  • 다음 c++ - QtCreator에서 특정 경고를 비활성화