Sformatuj liczbę do 2 miejsc po przecinku

154

Chciałbym wiedzieć, jak wyświetlić liczbę z 2 miejscami po przecinku, bez zaokrąglania pierwotnej liczby.

Na przykład:

2229,999 -> 2229,99

Już próbowałem:

FORMAT(2229.999, 2)
CONVERT(2229.999, DECIMAL(4,2))
Tenza
źródło
wygląda na to, że próbujesz użyć poleceń do obcięcia. Dlaczego po prostu nie skorzystać z wbudowanej funkcjonalności?
Fallenreaper,
Nie trzeba być przecinek DECIMAL(6,2)). 6- Dokładność (całkowita liczba cyfr), a 2 to liczba cyfr po przecinku?
user5249203

Odpowiedzi:

82

Chcesz użyć TRUNCATEpolecenia.

https://dev.mysql.com/doc/refman/8.0/en/mathematical-functions.html#function_truncate

jasonlfunk
źródło
9
Obcinanie zawsze „zaokrągla” w dół. 1,999 skrócone do 2 DP to 1,99, gdzie 2,00 byłoby matematycznie bardziej poprawne. Jeśli to nie jest problem, obcięcie jest w porządku, ale powinieneś być tego świadomy.
GordonM
Zgadzam się z GordonM i TRUNCATE powinno być używane z przyczynami, zwłaszcza z liczbami zmiennoprzecinkowymi!
Nebulosar
364

Podczas formatowania liczby do 2 miejsc po przecinku masz dwie opcje TRUNCATEi ROUND. Szukasz TRUNCATEfunkcji.

Przykłady:

Bez zaokrągleń:

TRUNCATE(0.166, 2)
-- will be evaluated to 0.16

TRUNCATE(0.164, 2)
-- will be evaluated to 0.16

dokumenty: http://www.w3resource.com/mysql/mathematical-functions/mysql-truncate-function.php

Z zaokrągleniem:

ROUND(0.166, 2)
-- will be evaluated to 0.17

ROUND(0.164, 2)
-- will be evaluated to 0.16

dokumenty: http://www.w3resource.com/mysql/mathematical-functions/mysql-round-function.php

jmarceli
źródło
2
powinieneś używać truncatedo formatowania liczb, jeśli chcesz liczb obciętych. w pytaniu dała jasno do zrozumienia, że ​​właśnie tego chce. istnieje wiele sposobów zaokrąglania (podłoga, sufit, od zera, do zera, do połowy w górę, do połowy w dół, w połowie równe). są odpowiednie w różnych kontekstach.
Kip
16
tak, oczywiście, ale jak widzę, wiele osób uważa, że ​​moja odpowiedź była pomocna lub może znaleźli to pytanie, szukając polecenia ROUND. Zostawię to tak, jak jest.
jmarceli
"nie powinieneś używać TRUNCATE do formatowania liczb, ponieważ po prostu stracisz obcięte cyfry" => Cóż, o to chodzi w obcięciu ... Nie widzę, jak powinniśmy uzyskać 0,17 z Math. Twoja odpowiedź jest idealna do przykładów programowania, ale nie jest zbyt dokładna.
Benoit Duffez,
2
Jak mówiłem wcześniej. WIEM, że to nie jest poprawna odpowiedź na to pytanie, ale ludziom się to podoba :) Może z powodu tytułu pytania, które mogłoby być wynikiem wyszukiwania dla osoby szukającej ROUNDfunkcji.
jmarceli
W takim razie powinieneś to naprawić. Nadal będę przydatny dla wszystkich i będzie w 100% poprawny. Win-win :)
Benoit Duffez,
14

Co powiesz CAST(2229.999 AS DECIMAL(6,2)) na uzyskanie ułamka dziesiętnego z dwoma miejscami po przecinku

Hituptony
źródło
4
Myślę, że masz na myśli obsadę (2229,999 jako dziesiętne (4,2))
Wujek Iroh
@UncleIroh, Nie, myślę, że on faktycznie ma na myśli convert(2229.999 as decimal(4,2)).
Pacerier
3
@Pacerier - Oba działają technicznie. Jednak format konwersji to konwersja (2229,999, dziesiętna (4,2)) z przecinkiem, więc prawdopodobnie masz rację, o to mu chodziło.
Wujek Iroh
@UncleIroh, Ach tak, moja literówka powyżej. Mówiłem o convert(2229.999, decimal(4,2)).
Pacerier
4
CAST (2229,999 AS DECIMAL (4,2)) daje 99,99. DECIMAL to maksymalna liczba cyfr, w tym 2 po lewej stronie miejsca dziesiętnego. CAST (2229,99 AS DECIMAL (6,2)) da ci 2230,00
russjohnson09
8

Po prostu użyj próbki format (liczba, liczba dziesiętna): format (1000, 2) wynik 1000,00

Alessandro Garcia
źródło
0

Oto jak użyłem tego jako przykładu:

CAST(vAvgMaterialUnitCost.`avgUnitCost` AS DECIMAL(11,2)) * woMaterials.`qtyUsed` AS materialCost
Tye Lucas
źródło
0

Pokaż jako dziesiętne Wybierz ifnull (format (100,00, 1, 'en_US'), 0) 100.0

Pokaż jako procent Wybierz konkat (ifnull (format (100,00, 0, 'en_US'), 0), '%') 100%

Gregory Bologna
źródło