복붙노트

[SQL] 어떻게 SQL에 소수점을 계산합니까?

SQL

어떻게 SQL에 소수점을 계산합니까?

나는 0 (소수)에 이르기까지 소수의 장소 (6) (최대)에와 수레의 가득 차있는 열 X가 있습니다. 나는 이상 6 소수 자릿수가 더 수레가 없다는 사실에 셀 수 있습니다. 감안할 때, 어떻게 그것은 나를 진수 쫓을 얼마나 많은 숫자 이야기하는 새 열 등해야합니까?

나는 어떤 스레드가 나는 진수 다음에 오는 문자열의 길이를 계산 한 다음 문자열을 구문 분석, 문자열로 플로트를 변환하는 CAST를 사용하는 것이 제안 보았다. 이 갈 수있는 가장 좋은 방법이 있나요?

해결법

  1. ==============================

    1.이 같은 것을 사용할 수 있습니다 :

    이 같은 것을 사용할 수 있습니다 :

    declare @v sql_variant
    
    set @v=0.1242311
    
    select SQL_VARIANT_PROPERTY(@v, 'Scale') as Scale
    

    이는 7을 반환합니다.

    나는 플로트 열이 위의 쿼리 작업을 만들기 위해 시도했지만이 같은 예상으로 작업 할 수 없습니다. http://sqlfiddle.com/#!6/5c62c/2 : 당신이 여기에서 볼 수 있듯이 그것은 단지의 sql_variant 열 작동

    그래서 다른 방법을 찾아 진행이 대답에 구축, 나는이있어 :

    SELECT value,
    LEN(
        CAST(
             CAST(
                  REVERSE(
                          CONVERT(VARCHAR(50), value, 128)
                         ) AS float
                 ) AS bigint
            )
       ) as Decimals
    FROM Numbers
    

    여기에 SQL 바이올린이 아웃 테스트입니다 : http://sqlfiddle.com/#!6/23d4f/29

    그 작은 특질을 고려하여, 여기에 float 값이 더 소수 부분이없는 경우를 처리하는 수정 된 버전입니다 :

    SELECT value,
           Decimals = CASE Charindex('.', value)
                        WHEN 0 THEN 0
                        ELSE
               Len (
                Cast(
                 Cast(
                  Reverse(CONVERT(VARCHAR(50), value, 128)) AS FLOAT
                     ) AS BIGINT
                    )
                   )
                        END
    FROM   numbers
    

    여기에 첨부 SQL 바이올린이있다 : http://sqlfiddle.com/#!6/10d54/11

  2. ==============================

    2.하는 부동 소수점은 실수를 표현한다. 실수의 소수점 이하 자릿수의 수에 아무 의미가 없습니다. 특히 실제 숫자 3은 모든 소수점이 제로임을 단지, 여섯 개 소수점 장소, 3.000000을 가질 수 있습니다.

    하는 부동 소수점은 실수를 표현한다. 실수의 소수점 이하 자릿수의 수에 아무 의미가 없습니다. 특히 실제 숫자 3은 모든 소수점이 제로임을 단지, 여섯 개 소수점 장소, 3.000000을 가질 수 있습니다.

    당신은 소수점의 오른쪽 가장 0 값을 표시되지 디스플레이 변환을 할 수 있습니다.

    6 소수점 최대가되는 이유는, 표시 전환이 일곱 번째 소수 자리 값을 커미트되지 않도록 일곱째가 부정확가 있다는 것을 또한주의.

    또한 수레가 바이너리에 저장하고, 실제로 바이너리 지점의 오른쪽에 진 장소가되어 있습니다. 진수 표시 차례로 실수의 근사치 플로트 스토리지 이진 합리적인 근사치이다.

    요점은 그래서, 정말 float 값은 얼마나 많은 소수 자릿수 아무 의미가 없다. 당신이 문자열로 변환 할 경우에는 소수점을 셀 수 (캐스트를 사용하여 말한다). 그건 정말 당신이 뭘 하려는지위한 최선의 방법이 될 것입니다.

  3. ==============================

    3.이 스레드는 또한 CAST를 사용하고,하지만 난 대답에 흥미를 발견 :

    이 스레드는 또한 CAST를 사용하고,하지만 난 대답에 흥미를 발견 :

    http://www.sqlservercentral.com/Forums/Topic314390-8-1.aspx

    DECLARE @Places INT
     SELECT TOP 1000000 @Places = FLOOR(LOG10(REVERSE(ABS(SomeNumber)+1)))+1
       FROM dbo.BigTest
    

    오라클의 :

    SELECT FLOOR(LOG(10,REVERSE(CAST(ABS(.56544)+1 as varchar(50))))) + 1 from DUAL
    
  4. ==============================

    4.나는 이것을 전에 대답하지만, 조금 불분명 것을 내가 코멘트에서 알 수 있습니다. 시간이지나면서 나는이 표현하는 더 나은 방법을 발견했다.

    나는 이것을 전에 대답하지만, 조금 불분명 것을 내가 코멘트에서 알 수 있습니다. 시간이지나면서 나는이 표현하는 더 나은 방법을 발견했다.

    같은 파이를 고려

    (a) 3.141592653590
    

    11 개 진수 장소로이 쇼 파이. 그러나,이 14 자리, PI로서 12 소수점이다 반올림

    (b) 3.1415926535897932
    

    이진 컴퓨터 또는 데이터베이스 값을 저장. 단 정밀도 부동 소수점의 경우, PI는 다음과 같이 저장됩니다

    (c) 3.141592739105224609375
    

    이것은 실제로 우리의 (a)에 둥근 것과 같이, 단 정밀도에 저장할 수있는 가장 가까운 값으로 반올림됩니다. 단 정밀도 캔 저장소는 다음으로 낮은 수

    (d) 3.141592502593994140625
    

    당신이 소수 자릿수의 수를 계산하려고 할 때 그래서, 당신은 모든 남아있는 소수가 제로가 될 것입니다 후 얼마나 많은 소수의 장소를 찾기 위해 노력하고 있습니다. 수를 저장하기 위해 반올림해야 할 수도 있기 때문에, 그것은 올바른 값을 나타내지 않습니다.

    수학적 연산이 수를 입력 할 때 이진 소수점으로 변환 한 값을 표시 할 때 이진 소수점으로 변환을 포함하여, 수행 될 때 숫자는 반올림 오차를 소개한다.

    이 스토리지의 제한된 양의 저장소로 반올림 근사 때문에 안정적으로 데이터베이스에서 숫자가 소수 자릿수를 찾을 수 없습니다. 데이터베이스의 진정한 가치, 또는 정확한 이진 값의 차이는 진수를 표현하기 위해 반올림됩니다. 당신이 제로가 다음 더 이상 0이 아닌 자릿수를했을 때 모르는, 그래서 항상 반올림에서 누락 된 많은 진수가있을 수 있습니다.

  5. ==============================

    5.Oracle 용 솔루션 그러나 당신은 아이디어를 얻었다. TRUNC ()는 오라클의 소수 부분을 제거합니다.

    Oracle 용 솔루션 그러나 당신은 아이디어를 얻었다. TRUNC ()는 오라클의 소수 부분을 제거합니다.

    select *
    from your_table
    where (your_field*1000000 - trunc(your_field*1000000)) <> 0;
    

    쿼리의 아이디어는 : 곱하기 1 000 000에 의해 후 남아있는 소수가있을 것입니다.

  6. ==============================

    6.여기에 또 다른 오라클 예입니다. 그들은 저와 downvoting 등 ... 문자열 및 INSTRING에 비명을 시작하기 전에 항상 비 오라클 사용자에게 경고로 ANSI SQL 표준 함수입니다 및 SQL에서 사용할 수 있습니다. 듀얼 테이블은 다른 테이블로 대체하거나 생성 할 수 있습니다. 저는 여기에서 듀얼 테이블 코드를 복사 whre SQL 서버에 블로그에 대한 링크는 다음과 같습니다 http://blog.sqlauthority.com/2010/07/20/sql-server-select-from-dual-dual-equivalent/

    여기에 또 다른 오라클 예입니다. 그들은 저와 downvoting 등 ... 문자열 및 INSTRING에 비명을 시작하기 전에 항상 비 오라클 사용자에게 경고로 ANSI SQL 표준 함수입니다 및 SQL에서 사용할 수 있습니다. 듀얼 테이블은 다른 테이블로 대체하거나 생성 할 수 있습니다. 저는 여기에서 듀얼 테이블 코드를 복사 whre SQL 서버에 블로그에 대한 링크는 다음과 같습니다 http://blog.sqlauthority.com/2010/07/20/sql-server-select-from-dual-dual-equivalent/

    CREATE TABLE DUAL
    (
     DUMMY VARCHAR(1)
    )
    GO
    INSERT INTO DUAL (DUMMY)
    VALUES ('X')
    GO
    

    점 또는 소수점 이후의 길이는이 쿼리에 의해 반환됩니다. 이 STR 필요한 경우 변환 TO_NUMBER (STR)를 할 수 있습니다. 길이로 변경 코드 (SUBSTR (STR, 1, dot_pos)) - - 또한 도트 소수 자릿수 전에 문자열의 길이를 얻을 수있는 일을하고 INSTR 부분에 +1을 제거 :

    SELECT str, LENGTH(SUBSTR(str, dot_pos)) str_length_after_dot FROM
    (
     SELECT '000.000789' as str
          , INSTR('000.000789', '.')+1 dot_pos 
       FROM dual
    )
    /
    
    SQL>
    
    STR           STR_LENGTH_AFTER_DOT
    ----------------------------------
    000.000789    6
    

    당신은 이미 답 등 캐스팅에 대한 증거를 가지고 ...

  7. from https://stackoverflow.com/questions/14715141/how-do-i-count-decimal-places-in-sql by cc-by-sa and MIT license