Formate o número para 2 casas decimais

154

Gostaria de saber como posso gerar um número com 2 casas decimais, sem arredondar o número original.

Por exemplo:

2229,999 -> 2229,99

Eu já tentei:

FORMAT(2229.999, 2)
CONVERT(2229.999, DECIMAL(4,2))
Tenza
fonte
parece que você está tentando usar comandos para truncar. Por que não usar apenas a funcionalidade incorporada?
Fallenreaper
Você não precisa que o decimal seja DECIMAL(6,2)). 6- Precisão (número de dígitos totais) e 2 é o número de dígitos após o decimal?
user5249203

Respostas:

82

Você deseja usar o TRUNCATEcomando

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

jasonlfunk
fonte
9
Truncar sempre "arredonda" para baixo. 1.999 truncado para 2 DP seria 1,99, onde 2,00 seria matematicamente mais correto. Se isso não for um problema, então truncar está bem, mas você deve estar ciente disso.
precisa saber é o seguinte
Concordo com GordonM e TRUNCATE deve ser usado com causalidade, especialmente com números de ponto flutuante!
Nebulosar
364

Ao formatar o número para 2 casas decimais, você tem duas opções TRUNCATEe ROUND. Você está procurando TRUNCATEfunção.

Exemplos:

Sem arredondamento:

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

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

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

Com arredondamento:

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

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

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

jmarceli
fonte
2
você deve usar truncatepara formatar números quando desejar números truncados. ela deixou bem claro na pergunta que era isso que ela queria fazer. existem muitas maneiras de arredondar (piso, teto, longe de zero, na direção de zero, meio para cima, meio para baixo, meio plano). eles são apropriados em diferentes contextos.
Kip
16
Sim, claro, mas como posso ver, muitas pessoas acham que minha resposta foi útil ou talvez tenham encontrado essa pergunta quando procuravam pelo comando ROUND. Vou deixar como está.
21134 jmarceli
"você não deve usar TRUNCATE para formatar números, porque simplesmente perderá dígitos truncados" => Bem, esse é o ponto da truncagem ... Não vejo como devemos obter 0,17 com o Math. Sua resposta é perfeita para exemplos de programação, mas não é muito completa.
Benoit Duffez
2
Como eu disse antes. EU SEI que não é uma resposta correta para esta pergunta, mas as pessoas tendem a gostar :) Talvez por causa do título da pergunta, que poderia ser o resultado da pesquisa para alguém que está procurando a ROUNDfunção.
jmarceli
Então você deve consertar. Ainda serei útil para todos e será 100% correto. Win-win :)
Benoit Duffez
14

Que tal CAST(2229.999 AS DECIMAL(6,2)) obter um decimal com 2 casas decimais

Hituptonia
fonte
4
Eu acho que você quer dizer elenco (2229.999 como decimal (4,2))
Tio Iroh
@UncleIroh, não, acho que ele realmente quer dizer convert(2229.999 as decimal(4,2)).
Pacerier
3
@ Pacerier - Ambos funcionam tecnicamente. No entanto, o formato para convert é convert (2229.999, decimal (4,2)) com vírgula, então você provavelmente está certo nisso.
Tio Iroh
@UncleIroh, Ah sim, meu erro de digitação acima. Eu estava falando convert(2229.999, decimal(4,2)).
Pacerier
4
CAST (2229.999 COMO DECIMAL (4,2)) fornecerá 99,99. DECIMAL é o número máximo de dígitos, incluindo o 2 à esquerda da casa decimal. O CAST (2229.99 AS DECIMAL (6,2)) fornecerá a você 2230,00
russjohnson09:
8

Basta usar a amostra format (number, qtyDecimals): resultado do formato (1000, 2) 1000,00

Alessandro Garcia
fonte
0

Isto é como eu usei isso é como um exemplo:

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

Mostrar como decimal Selecione se nulo (formato (100,00, 1, 'en_US'), 0) 100,0

Mostrar como porcentagem Selecione concat (ifnull (format (100.00, 0, 'en_US'), 0), '%') 100%

Gregory Bologna
fonte