Obcinaj (nie zaokrąglaj) miejsca dziesiętne w SQL Server


194

Próbuję ustalić najlepszy sposób obcięcia lub upuszczenia dodatkowych miejsc dziesiętnych w SQL bez zaokrąglania. Na przykład:

declare @value decimal(18,2)

set @value = 123.456

Spowoduje to automatyczne runda @valuesię 123.46, co jest dobre w większości przypadków. Jednak do tego projektu nie potrzebuję tego. Czy istnieje prosty sposób na obcięcie ułamków dziesiętnych, których nie potrzebuję? Wiem, że mogę korzystać z left()funkcji i konwertować z powrotem na dziesiętne. Czy są jakieś inne sposoby?

Odpowiedzi:


188
select round(123.456, 2, 1)

28
Odpowiedź powinna wyjaśniać, jakie są parametry funkcji
Tyler,

9
SQL ROUND (liczba, dziesiętne, operacja): operacja -> Jeśli 0, zaokrągla wynik do liczby dziesiętnej. Jeśli inna wartość niż 0, obcina wynik do liczby miejsc po przecinku. Domyślnie 0
Midhun Darvin

jesteś ratownikiem, miałem do pokazania tylko dwie ostatnie cyfry „1.9991666”, ale zawsze zaokrąglałem w górę do 2 bez względu na to, czego używam, dzięki temu jestem w stanie osiągnąć coś takiego - wybierz FORMAT (okrągły (1.9991666 , 2, 1), „N2”) AS „Rate”, Dzięki kolego
Spider

269
ROUND ( 123.456 , 2 , 1 )

Gdy trzeci parametr ! = 0 , obcina się, a nie zaokrągla

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

Składnia

ROUND ( numeric_expression , length [ ,function ] )

Argumenty

  • numeric_expression Jest wyrażeniem dokładnej liczbowej lub przybliżonej kategorii danych liczbowych, z wyjątkiem typu danych bitowych.

  • length Jest precyzją, do której należy zaokrąglić wyrażenie liczbowe. długość musi być wyrażeniem typu tinyint, smallint lub int. Gdy długość jest liczbą dodatnią, wyrażenie numeryczne jest zaokrąglane do liczby miejsc dziesiętnych określonych przez długość. Gdy długość jest liczbą ujemną, wyrażenie liczbowe jest zaokrąglane po lewej stronie przecinka, zgodnie z długością.

  • function Jest typem operacji do wykonania. funkcja musi być tinyint, smallint lub int. Gdy funkcja jest pominięta lub ma wartość 0 (domyślnie), wyrażenie numeryczne jest zaokrąglane. Jeśli podano wartość inną niż 0, wyrażenie numeryczne jest obcinane.

Czy ktoś wie, jakie wartości argumentu funkcji odpowiadają tinyint, smallint i int? Microsoft pozostawił tę część w swojej dokumentacji i nigdzie nie może znaleźć odpowiedzi. msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
Dave

MS SQL SERVER zaokrągla liczby nieco inaczej niż IQ. Aby to naprawić, użyj funkcji round (x, y, z), takiej jak ta runda (val1 / val2,4,1)
Warren LaFrance


13

Oto sposób, w jaki mogłem obciąć, a nie zaokrąglić:

select 100.0019-(100.0019%.001)

zwraca 100,0010

I twój przykład:

select 123.456-(123.456%.001)

zwraca 123,450

Teraz, jeśli chcesz pozbyć się końcowego zera, po prostu rzuć:

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

zwraca 123,45


10

W rzeczywistości, niezależnie od trzeciego parametru, 0, 1 lub 2, nie zaokrągli on twojej wartości.

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

Nie rozumiem tej odpowiedzi. Podany SQL daje wynik 10.01, co jest poprawnym zaokrągleniem 10.0055 do dwóch miejsc po przecinku. Jeśli końcowy parametr nie jest równy 0, wartość jest obcięta (do 2 miejsc po przecinku) do 10,00.
8128

7

Runda ma opcjonalny parametr

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

3
Wybrana runda (123.456, 2, 1) będzie = 123.450
Bikram

4
Nie rozumiem, dlaczego to zyskuje aprobatę. Powyższe da ci odpowiednio 123.450 i 123.460.
remykarem

7

Chcesz przecinek dziesiętny czy nie?

Jeśli nie, użyj

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

Jeśli zrobisz to z 0, zrób rundę:

select round(@value,2)

1
Przepraszam, jeśli nie byłem jasny, muszę zachować miejsca dziesiętne, po prostu upuść te, których nie chcę. Na przykład, zamiast 123.456 w powyższym przykładzie konwertowanym na 123,46 ... Chcę upuścić trzeci ułamek dziesiętny i ustawić go na 123.45.
Ryan Eastabrook,

6

Kolejne obcinanie bez rozwiązania zaokrąglania i przykład.

    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, dla Floor()którego jest to sposób na opuszczanie miejsc po przecinku bez zaokrąglania. Szkoda, że ​​Floor () nie ma drugiego parametru wskazującego, w której pozycji. Ale myślę, że * 10) / 10 rzeczywiście działa całkiem dobrze.
deroby

4

Spowoduje to usunięcie części dziesiętnej dowolnej liczby

SELECT ROUND(@val,0,1)

2
To nie. WYBIERZ ZAOKR (123.4560,0,1) daje w zamian 123.0000.
remykarem

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

Dałby 2 wartości po przecinku. (MS SQL SERVER)


1

Innym sposobem jest ODBC TRUNCATEfunkcja:

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

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

LiveDemo

Wynik:

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

Uwaga:

Polecam użycie wbudowanej ROUNDfunkcji z 3. parametrem ustawionym na 1.


1
Funkcja skalarna ODBC - inna alternatywa!
Arulmouzhi

1

Wiem, że jest już dość późno, ale nie widzę w tym odpowiedzi i od lat używam tej sztuczki.

Po prostu odejmij 0,005 od swojej wartości i użyj Round (@ num, 2).

Twój przykład:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

zwraca 123,45

Automatycznie dostosuje zaokrąglenie do prawidłowej wartości, której szukasz.

Nawiasem mówiąc, czy odtwarzasz program z filmu Office Space?


0

Spróbuj użyć tego kodu do konwersji 3 wartości dziesiętnych po kropce na 2 miejsca dziesiętne:

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

select @val

Dane wyjściowe to 123,46


1) 3. linia jest całkowicie niepotrzebna 2) wyraźnie powiedział, że nie chce zaokrąglać liczby, ale ją obciąć (wynik powinien wynosić 123,45)
Damián Pablo González

0

Myślę, że chcesz tylko wartość dziesiętną, w tym przypadku możesz użyć następujących opcji:

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

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

0

Wiem, że to pytanie jest naprawdę stare, ale nikt nie używał podciągów do zaokrąglania. Zaletą jest możliwość zaokrąglania naprawdę długich liczb (limit ciągu znaków w serwerze SQL, który zwykle wynosi 8000 znaków):

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

0

Myślę, że możemy przejść o wiele łatwiej dzięki prostszemu przykładowemu rozwiązaniu znalezionemu w Hackerrank:

Stwierdzenie problemu: Zapytaj o największą wartość szerokości geograficznej północnej (LAT_N) ze STATION, która jest mniejsza niż 137,2345. Skróć swoją odpowiedź do 4 miejsc po przecinku.

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

Rozwiązanie powyżej daje wyobrażenie, jak po prostu ograniczyć wartość do 4 miejsc po przecinku. Jeśli chcesz obniżyć lub zwiększyć liczby po przecinku, po prostu zmień 4 na dowolne.



-5
select convert(int,@value)

1
Nie tego chciał OP. Nadal chce miejsc po przecinku, ale chce je usunąć (truncte) zamiast je zaokrąglać. IE 123.456 -> 123.45 NOT 123.456 -> 12.46 i NOT 123.456 -> 123
John
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.