[SQL] 어떻게 SQL에 소수점을 계산합니까?
SQL어떻게 SQL에 소수점을 계산합니까?
나는 0 (소수)에 이르기까지 소수의 장소 (6) (최대)에와 수레의 가득 차있는 열 X가 있습니다. 나는 이상 6 소수 자릿수가 더 수레가 없다는 사실에 셀 수 있습니다. 감안할 때, 어떻게 그것은 나를 진수 쫓을 얼마나 많은 숫자 이야기하는 새 열 등해야합니까?
나는 어떤 스레드가 나는 진수 다음에 오는 문자열의 길이를 계산 한 다음 문자열을 구문 분석, 문자열로 플로트를 변환하는 CAST를 사용하는 것이 제안 보았다. 이 갈 수있는 가장 좋은 방법이 있나요?
해결법
-
==============================
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.하는 부동 소수점은 실수를 표현한다. 실수의 소수점 이하 자릿수의 수에 아무 의미가 없습니다. 특히 실제 숫자 3은 모든 소수점이 제로임을 단지, 여섯 개 소수점 장소, 3.000000을 가질 수 있습니다.
하는 부동 소수점은 실수를 표현한다. 실수의 소수점 이하 자릿수의 수에 아무 의미가 없습니다. 특히 실제 숫자 3은 모든 소수점이 제로임을 단지, 여섯 개 소수점 장소, 3.000000을 가질 수 있습니다.
당신은 소수점의 오른쪽 가장 0 값을 표시되지 디스플레이 변환을 할 수 있습니다.
6 소수점 최대가되는 이유는, 표시 전환이 일곱 번째 소수 자리 값을 커미트되지 않도록 일곱째가 부정확가 있다는 것을 또한주의.
또한 수레가 바이너리에 저장하고, 실제로 바이너리 지점의 오른쪽에 진 장소가되어 있습니다. 진수 표시 차례로 실수의 근사치 플로트 스토리지 이진 합리적인 근사치이다.
요점은 그래서, 정말 float 값은 얼마나 많은 소수 자릿수 아무 의미가 없다. 당신이 문자열로 변환 할 경우에는 소수점을 셀 수 (캐스트를 사용하여 말한다). 그건 정말 당신이 뭘 하려는지위한 최선의 방법이 될 것입니다.
-
==============================
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.나는 이것을 전에 대답하지만, 조금 불분명 것을 내가 코멘트에서 알 수 있습니다. 시간이지나면서 나는이 표현하는 더 나은 방법을 발견했다.
나는 이것을 전에 대답하지만, 조금 불분명 것을 내가 코멘트에서 알 수 있습니다. 시간이지나면서 나는이 표현하는 더 나은 방법을 발견했다.
같은 파이를 고려
(a) 3.141592653590
11 개 진수 장소로이 쇼 파이. 그러나,이 14 자리, PI로서 12 소수점이다 반올림
(b) 3.1415926535897932
이진 컴퓨터 또는 데이터베이스 값을 저장. 단 정밀도 부동 소수점의 경우, PI는 다음과 같이 저장됩니다
(c) 3.141592739105224609375
이것은 실제로 우리의 (a)에 둥근 것과 같이, 단 정밀도에 저장할 수있는 가장 가까운 값으로 반올림됩니다. 단 정밀도 캔 저장소는 다음으로 낮은 수
(d) 3.141592502593994140625
당신이 소수 자릿수의 수를 계산하려고 할 때 그래서, 당신은 모든 남아있는 소수가 제로가 될 것입니다 후 얼마나 많은 소수의 장소를 찾기 위해 노력하고 있습니다. 수를 저장하기 위해 반올림해야 할 수도 있기 때문에, 그것은 올바른 값을 나타내지 않습니다.
수학적 연산이 수를 입력 할 때 이진 소수점으로 변환 한 값을 표시 할 때 이진 소수점으로 변환을 포함하여, 수행 될 때 숫자는 반올림 오차를 소개한다.
이 스토리지의 제한된 양의 저장소로 반올림 근사 때문에 안정적으로 데이터베이스에서 숫자가 소수 자릿수를 찾을 수 없습니다. 데이터베이스의 진정한 가치, 또는 정확한 이진 값의 차이는 진수를 표현하기 위해 반올림됩니다. 당신이 제로가 다음 더 이상 0이 아닌 자릿수를했을 때 모르는, 그래서 항상 반올림에서 누락 된 많은 진수가있을 수 있습니다.
-
==============================
5.Oracle 용 솔루션 그러나 당신은 아이디어를 얻었다. TRUNC ()는 오라클의 소수 부분을 제거합니다.
Oracle 용 솔루션 그러나 당신은 아이디어를 얻었다. TRUNC ()는 오라클의 소수 부분을 제거합니다.
select * from your_table where (your_field*1000000 - trunc(your_field*1000000)) <> 0;
쿼리의 아이디어는 : 곱하기 1 000 000에 의해 후 남아있는 소수가있을 것입니다.
-
==============================
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
당신은 이미 답 등 캐스팅에 대한 증거를 가지고 ...
from https://stackoverflow.com/questions/14715141/how-do-i-count-decimal-places-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] TRY의 CATCH 안에 단일 문에서 여러 오류 메시지를 캡처 (0) | 2020.07.05 |
---|---|
[SQL] LIMIT & IN / ALL / ANY / SOME 서브 쿼리에 문제가 (0) | 2020.07.05 |
[SQL] SQL 쿼리 최신 가격을 얻으려면 (0) | 2020.07.05 |
[SQL] SQL 서버의 열의 합계를 실행 얻는 방법 (0) | 2020.07.05 |
[SQL] 어떻게 테이블의 모든 열을 검색 할 수 있습니다? (0) | 2020.07.05 |