SQL Server에서 소수점 이하 자르기 (둥근 아님)


194

반올림하지 않고 SQL에서 소수점 이하 자릿수를 자르거나 삭제하는 가장 좋은 방법을 결정하려고합니다. 예를 들면 다음과 같습니다.

declare @value decimal(18,2)

set @value = 123.456

이것은 자동으로 라운드 할 @value수하는 123.46대부분의 경우 좋은이다. 그러나이 프로젝트에는 필요하지 않습니다. 필요하지 않은 소수를 자르는 간단한 방법이 있습니까? left()함수를 사용하고 십진수로 다시 변환 할 수 있다는 것을 알고 있습니다 . 다른 방법이 있습니까?

답변:


188
select round(123.456, 2, 1)

28
답은 함수의 매개 변수가 무엇인지 설명해야합니다.
Tyler

9
SQL ROUND (숫자, 소수, 연산) : operation-> 0이면 결과를 소수로 반올림합니다. 0이 아닌 다른 값이면 10 진수로 결과가 잘립니다. 기본값은 0
Midhun Darvin

당신은 생명의 은인입니다. 나는 마지막 두 자리에만 "1.9991666"을 보여줄 금액이 있었지만, 내가 무엇을 사용하든 항상 2로 올림했습니다. , 2, 1), 'N2') AS 'Rate', 고마워 친구
Spider

269
ROUND ( 123.456 , 2 , 1 )

세 번째 매개 변수 ! = 0 일 때 반올림하지 않고 잘립니다.

http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

통사론

ROUND ( numeric_expression , length [ ,function ] )

인수

  • numeric_expression 비트 데이터 유형을 제외한 정확한 숫자 또는 대략적인 숫자 데이터 유형 범주의 표현식입니다.

  • length numeric_expression을 반올림 할 정밀도입니다. length는 tinyint, smallint 또는 int 유형의 표현식이어야합니다. length가 양수인 경우 numeric_expression은 length로 지정된 소수 자릿수로 반올림됩니다. length가 음수이면 numeric_expression은 length로 지정된 소수점 왼쪽에서 반올림됩니다.

  • function 수행 할 작업 유형입니다. 함수는 tinyint, smallint 또는 int 여야합니다. 함수가 생략되거나 값이 0 (기본값)이면 numeric_expression이 반올림됩니다. 0 이외의 값을 지정하면 numeric_expression이 잘립니다.

누구든지 함수 인수의 값이 tinyint, smallint 및 int에 해당하는지 알고 있습니까? 마이크로 소프트는 그 부분을 문서에서 제외 시켰고 어디에서도 답을 찾을 수 없었다. msdn.microsoft.com/ko-kr/library/ms175003(SQL.90).aspx
Dave

MS SQL SERVER는 숫자를 IQ와 조금 다르게 반올림합니다. 이 round (val1 / val2,4,1)와 같은 round (x, y, z) 함수를 수정하려면
Warren LaFrance

37
SELECT Cast(Round(123.456,2,1) as decimal(18,2))

13

자르고 둥글게하지 않는 방법은 다음과 같습니다.

select 100.0019-(100.0019%.001)

100.0010을 반환

그리고 당신의 예 :

select 123.456-(123.456%.001)

123.450을 반환

이제 끝나는 0을 제거하려면 간단히 캐스트하십시오.

select cast((123.456-(123.456%.001)) as decimal (18,2))

123.45를 반환


10

실제로 세 번째 매개 변수가 0 또는 1 또는 2이면 값을 반올림하지 않습니다.

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))

이 답변을 이해하지 못합니다. 주어진 SQL의 결과는 10.01이며 소수점 이하 두 자리에서 10.0055의 올바른 반올림입니다. 최종 매개 변수가 0이 아닌 경우 값은 소수점 이하 2 자리까지 10.00으로 잘립니다.
8128

7

라운드는 선택적 매개 변수가 있습니다

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46

3
라운드 (123.456, 2, 1) 선택은 123.450
Bikram

4
왜 이것이 공짜인지 알 수 없습니다. 위의 내용은 각각 123.450 및 123.460입니다.
remykarem

7

소수점을 원하십니까?

그렇지 않은 경우

select ceiling(@value),floor(@value)

0으로하면 라운드를 수행하십시오.

select round(@value,2)

1
내가 명확하지 않으면 죄송합니다. 소수 자리를 유지해야합니다. 원하지 않는 것을 삭제하십시오. 예를 들어 위의 예에서 123.456 대신 123.46으로 변환됩니다 ... 세 번째 소수점을 삭제하고 123.45로 만들고 싶습니다.
Ryan Eastabrook

6

반올림 솔루션과 예제가없는 다른 자르기.

    Convert 71.950005666 to a single decimal place number (71.9)
    1) 71.950005666 * 10.0 = 719.50005666
    2) Floor(719.50005666) = 719.0
    3) 719.0 / 10.0 = 71.9

    select Floor(71.950005666 * 10.0) / 10.0

2
+1은 Floor()실제로 반올림하지 않고 소수를 버리는 방법입니다. 너무 나쁜 층 ()에는 어떤 위치를 나타내는 두 번째 매개 변수가 없습니다. 그러나 나는 * 10) / 10이 실제로 잘 작동한다고 생각합니다.
deroby

4

이것은 모든 숫자의 소수 부분을 제거합니다

SELECT ROUND(@val,0,1)

2
그렇지 않습니다. SELECT ROUND (123.4560,0,1)는 대신 123.0000을 제공합니다.
remykarem

2
SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;

소수점 다음에 2 개의 값을 제공합니다. (MS SQL 서버)


1

다른 방법은 ODBC TRUNCATE기능입니다.

DECLARE @value DECIMAL(18,3) =123.456;

SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result

LiveDemo

산출:

╔═════════╦═════════╗
   val    result  
╠═════════╬═════════╣
 123,456  123,450 
╚═════════╩═════════╝

말:

ROUND3 번째 파라미터가 1로 설정된 내장 기능을 사용하는 것이 좋습니다 .


1
ODBC 스칼라 함수-다른 대안!
Arulmouzhi

1

나는 이것이 꽤 늦다는 것을 알고 있지만 대답으로 보지 못하고 수년간이 트릭을 사용 해 왔습니다.

단순히 값에서 .005를 빼고 Round (@ num, 2)를 사용하십시오.

귀하의 예 :

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

123.45를 반환

원하는 올바른 값으로 반올림을 자동으로 조정합니다.

그건 그렇고, 영화 Office Space에서 프로그램을 다시 작성하고 있습니까?


0

점 다음에 소수점 이하 3 자리를 소수점 2 자리로 변환하려면이 코드를 사용하십시오.

declare @val decimal (8, 2)
select @val = 123.456
select @val =  @val

select @val

출력은 123.46입니다


1) 세 번째 줄은 완전히 불필요합니다. 2) 그는 숫자를 반올림하고 싶지 않지만 잘라냅니다 (결과는 123.45 여야 함)
Damián Pablo González

0

나는 당신이 10 진수 값만을 ​​원한다고 생각합니다.이 경우 다음을 사용할 수 있습니다 :

declare @val decimal (8, 3)
SET @val = 123.456

SELECT @val - ROUND(@val,0,1)

0

나는이 질문이 실제로 오래되었다는 것을 알고 있지만 아무도 하위 문자열을 반올림하지 않았습니다. 이것은 실제로 긴 숫자를 반올림 할 수있는 장점 (일반적으로 8000자인 SQL 서버의 문자열 제한) :

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)

0

Hackerrank에있는 간단한 예제 솔루션으로 훨씬 쉽게 갈 수 있다고 생각합니다.

문제 설명 : STATION에서 137.2345보다 작은 북위도 (LAT_N)의 최대 값을 쿼리하십시오. 소수점 이하 4 자리까지 자릅니다.

SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;

위의 솔루션은 단순히 소수점 4 자리로 값을 제한하는 방법에 대한 아이디어를 제공합니다. 소수점 이하의 숫자를 낮추거나 높이려면 4를 원하는 것으로 변경하십시오.


-3

Mod(x,1) 내가 생각하는 가장 쉬운 방법입니다.


-5
select convert(int,@value)

1
이것은 OP가 원하는 것이 아닙니다. 그는 여전히 소수점 이하 자릿수를 원하지만 반올림하지 않고 제거하기를 원합니다. IE 123.456-> 123.45 NOT 123.456-> 12.46 및 NOT 123.456-> 123
John
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.