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))

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

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


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


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


0

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

CAST(vAvgMaterialUnitCost.`avgUnitCost` AS DECIMAL(11,2)) * woMaterials.`qtyUsed` AS materialCost

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%

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.