문제

반올림하지 않고 SQL에서 추가 소수 자릿수를 자르거나 삭제하는 가장 좋은 방법을 결정하려고 합니다.예를 들어:

declare @value decimal(18,2)

set @value = 123.456

자동으로 반올림됩니다. @value 장차 ~ 가 되는 123.46, 대부분의 경우에 좋습니다.하지만 이 프로젝트에서는 그런 것이 필요하지 않습니다.필요하지 않은 소수점 이하 자릿수를 자르는 간단한 방법이 있나요?나는 그것을 사용할 수 있다는 것을 안다. left() 함수를 사용하여 다시 십진수로 변환합니다.다른 방법이 있나요?

도움이 되었습니까?

해결책

select round(123.456, 2, 1)

다른 팁

ROUND ( 123.456 , 2 , 1 )

세 번째 매개변수일 때 != 0 반올림보다는 잘립니다.

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

통사론

ROUND ( 숫자 표현식 , 길이 [ , 함수 ] )

인수

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

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

  • 기능수행할 작업 유형입니다.함수는tinyint, smallint 또는 int여야 합니다.function이 생략되거나 값이 0(기본값)인 경우 숫자_표현식은 반올림됩니다.0이 아닌 값을 지정하면 숫자 표현식이 잘립니다.
SELECT Cast(Round(123.456,2,1) as decimal(18,2))

반올림하지 않고 잘라내는 방법은 다음과 같습니다.

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를 반환합니다.

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

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

Round에는 선택적 매개변수가 있습니다.

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

반올림 솔루션과 예가 없는 또 다른 잘림입니다.

    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

소수를 원하시나요, 아니면 원하지 않으시나요?

그렇지 않은 경우

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

0으로 하면 라운드를 수행합니다.

select round(@value,2)

이렇게 하면 숫자의 소수 부분이 제거됩니다.

SELECT ROUND(@val,0,1)

나는 이것이 꽤 늦었다는 것을 알고 있지만 그것이 답이라고 생각하지 않으며 수년 동안 이 트릭을 사용해 왔습니다.

값에서 .005를 빼고 Round(@num,2)를 사용하면 됩니다.

귀하의 예:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

123.45를 반환합니다.

찾고 있는 올바른 값으로 반올림이 자동으로 조정됩니다.

그런데 영화 Office Space에 나오는 프로그램을 재현하는 건가요?

점 뒤의 소수점 3자리 값을 소수점 이하 2자리로 변환하려면 다음 코드를 사용해 보세요.

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

select @val

출력은 123.46입니다.

소수점 값 만 원한다고 생각합니다.이 경우 다음을 사용할 수 있습니다.

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

SELECT @val - ROUND(@val,0,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 ║
╚═════════╩═════════╝

주목:

내장을 사용하는 것이 좋습니다 ROUND 세 번째 매개변수가 1로 설정된 함수입니다.

나는 이 질문이 정말 오래되었다는 것을 알고 있지만 반올림에 하위 문자열을 사용하는 사람은 아무도 없습니다.이는 매우 긴 숫자를 반올림하는 기능의 이점입니다(일반적으로 8000자인 SQL 서버의 문자열 제한).

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
select convert(int,@value)

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top