Форматировать число до 2 десятичных знаков


154

Я хотел бы знать, как я могу вывести число с двумя десятичными разрядами, не округляя исходное число.

Например:

2229,999 -> 2229,99

Я уже попробовал:

FORMAT(2229.999, 2)
CONVERT(2229.999, DECIMAL(4,2))

похоже, что вы пытаетесь использовать команды для усечения. Почему бы просто не использовать встроенную функциональность?
Fallenreaper

Разве вам не нужно десятичное число, чтобы быть DECIMAL(6,2)). 6- Точность (общее количество цифр) и 2 - количество цифр после десятичной дроби?
user5249203

Ответы:


82

Вы хотите использовать TRUNCATEкоманду.

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


9
Обрезать всегда «округляет» вниз. 1.999, усеченный до 2 DP, будет 1.99, где 2.00 будет математически более правильным. Если это не проблема, то усечение в порядке, но вы должны знать об этом.
ГордонМ

Я согласен с тем, что GordonM и TRUNCATE должны использоваться с причинно-следственной связью, особенно с числами с плавающей запятой!
Небулосар

364

При форматировании числа до 2 десятичных знаков у вас есть два варианта TRUNCATEи ROUND. Вы ищете TRUNCATEфункцию.

Примеры:

Без округления:

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

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

документы: http://www.w3resource.com/mysql/matumatic-functions/mysql-truncate-function.php

С округлением:

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

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

документы: http://www.w3resource.com/mysql/maturgical-functions/mysql-round-function.php


2
Вы должны использовать truncateдля форматирования чисел, когда вы хотите усеченные числа. она ясно дала понять, что именно этим она и хотела заниматься. Есть много способов округления (пол, потолок, от нуля, к нулю, половина вверх, половина вниз, половина даже). они уместны в разных контекстах.
Кип

16
да, конечно, но, как я вижу, многие находят, что мой ответ был полезен, или, возможно, они нашли этот вопрос, когда искали команду ROUND. Я оставлю это как есть.
Джмарсели

«Вы не должны использовать TRUNCATE для форматирования чисел, потому что вы просто потеряете усеченные цифры» => Ну, в этом смысл усечения ... Я не понимаю, как мы должны получить 0,17 с помощью Math. Ваш ответ идеально подходит для примеров программирования, но он не очень тщательный.
Бенуа Даффес

2
Как я сказал ранее. Я ЗНАЮ, что это неправильный ответ на этот вопрос, но людям это нравится. Может быть, из-за заголовка вопроса, который может быть результатом поиска для того, кто ищет эту ROUNDфункцию.
jmarceli

Тогда вы должны это исправить. Я все еще буду полезен для всех, и это будет на 100% правильно. Беспроигрышный :)
Бенуа Даффес

14

Как насчет CAST(2229.999 AS DECIMAL(6,2)) получить десятичную с двумя десятичными разрядами


4
Я думаю, что вы имеете в виду приведение (2229.999 как десятичное число (4,2))
Дядя Иро

@UncleIroh, нет, я думаю, что он на самом деле имеет в виду convert(2229.999 as decimal(4,2)).
Pacerier

3
@Pacerier - оба работают технически. Тем не менее, формат для convert - это convert (2229.999, decimal (4,2)) с запятой, так что вы, вероятно, правы в том, к чему он стремился.
Дядя Иро

@UncleIroh, Ах да, моя опечатка выше. Я говорил о convert(2229.999, decimal(4,2)).
Пейсер

4
CAST (2229.999 AS DECIMAL (4,2)) даст вам 99.99. DECIMAL - максимальное количество цифр, включая 2 слева от десятичного знака. CAST (2229.99 AS DECIMAL (6,2)) даст вам 2230.00
russjohnson09


0

Вот как я использовал это в качестве примера:

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

0

Показать как десятичное число Выберите ifnull (формат (100.00, 1, 'en_US'), 0) 100.0

Показать в процентах Выберите concat (ifnull (формат (100.00, 0, 'en_US'), 0), '%') 100%

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.