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

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

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


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


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


0

Isto é como eu usei isso é como um exemplo:

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

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%

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.