2016-10-26 6 views
1

Круглом функции с типом поплавка данныхКруглые функции в TSQL

DECLARE @Amt Float 
DECLARE @Tax Float 
DECLARE @Qty TINYINT 
SET @Amt=70.96 
SET @Tax=5.26 
SET @Qty=1 
SELECT ROUND((@[email protected])/@Qty, 2,1) 

Это дает мне выход в 65.69 , но я хочу 65,70

не знаем, почему это не работает для типа поплавка данных. Если мой тип данных десятичный, то он работает, но в моей БД его float, и я не хочу округлять.

Если я использую Преобразование в десятичную работает

SELECT ROUND((CONVERT(DECIMAL(10,2),@Amt)-CONVERT(DECIMAL(10,2),@Tax))/@Qty, 2,1) 

Это дает мне выход, как 65.700000.

Любое другое решение? plz help ..

+1

следует хранить суммы, которые необходимо точное представление в 'DECIMAL' типа данных, а не' FLOAT' тип данных ... Вы будете продолжать работать в проблемы с поплавками, что вы делаете, ... –

+0

или использовать «деньги», если это денежные суммы – Zeina

+0

Да, сначала исправить свою базу данных. Если, далее, ниже, вы хотите иметь дело с 0.000000003 (из любой валюты, с которой работаете) из-за накопленных ошибок округления –

ответ

1

Третий параметр функции ROUND указывает, должно ли значение быть округлено или усечено.

Таким образом, вы можете использовать следующую инструкцию, чтобы получить ожидаемый результат:

DECLARE @Amt Float 
DECLARE @Tax Float 
DECLARE @Qty TINYINT 
SET @Amt=70.96 
SET @Tax=5.26 
SET @Qty=1 
SELECT ROUND((@[email protected])/@Qty, 2,0) 

См MSDN подробности

1

Синтаксис: - ROUND (numeric_expression , length [ ,function ])

параметр Thaird является "функция" в round: - Таким образом, для значения, отличного от 0, указано (в третьем параметре), numeric_expression усекается. См. Ниже.

Из MSDN

Функция Является ли тип операции для выполнения. функция должна быть tinyint, smallint или int. Когда функция опущена или имеет значение 0 (по умолчанию), числовое выражение округляется. Когда значение, отличное от 0, задано , числовое выражение вырезается.

DECLARE @Amt Float 
    DECLARE @Tax Float 
    DECLARE @Qty TINYINT 
    SET @Amt=70.96 
    SET @Tax=5.26 
    SET @Qty=1 

    SELECT ROUND((@[email protected])/@Qty, 2,0) 

Для второго запроса вы использовали, я сделал несколько изменений, чтобы она выглядела ниже.

SELECT ROUND(CONVERT(DECIMAL(10,2),CONVERT(DECIMAL(10,2),@AMT)- 
CONVERT(DECIMAL(10,2),@TAX)/@QTY),2) 

Причина снова я использовал новообращенный, ваше выражение неявно преобразуются в десятичном (15,6) типа данных. Для дополнительной проверки ниже запросов

SELECT Sql_variant_property(CONVERT(DECIMAL(10, 2), @AMT) - CONVERT(DECIMAL(10, 2), @TAX)/@QTY, 'BASETYPE'), 
     Sql_variant_property(CONVERT(DECIMAL(10, 2), @AMT) - CONVERT(DECIMAL(10, 2), @TAX)/@QTY, 'SCALE'), 
     Sql_variant_property(CONVERT(DECIMAL(10, 2), @AMT) - CONVERT(DECIMAL(10, 2), @TAX)/@QTY, 'PRECISION') 
+0

Я не хочу округлять. Мне просто нужно усечь десятичные знаки после 2. – ManojK

+0

@ManojK Вам просто нужно сохранить 2-й параметр в качестве 2. Это будет округлять его до 2 десятичных знаков. И я обновил свой пост для вашего второго подхода. – Buddi

2

Ответ не использовать FLOAT, если вы можете избежать этого, особенно (!) Для денежных сумм.

Значение 70.96 - 5.26 = 65.7 является точной для нас, но оно не может быть сохранено точно в FLOAT, потому что 70/100 не имеет точного двоичного представления, и вы всегда получите закругленные артефакты.

Решение: используйте вместо этого DECIMAL.


Так как это:

DECLARE @Amt DECIMAL(10,2) 
DECLARE @Tax DECIMAL(10,2) 
DECLARE @Qty TINYINT 
SET @Amt=70.96 
SET @Tax=5.26 
SET @Qty=1 
SELECT (@[email protected])/@Qty 

И да, я уйти из круглодонного вызова, потому что ...

  • Это не изменит результат;
  • Если целью было получение вывода с определенным количеством десятичных знаков, это не должно выполняться на бэкэнде SQL, но в интерфейсе приложения/веб-сайта, потому что это вопрос презентации, что часто подразумевает выбор языка/региона/пользователя - настройки.
0

Использование CAST

DECLARE @Amt Float 
DECLARE @Tax Float 
DECLARE @Qty TINYINT 
SET @Amt=70.96 
SET @Tax=5.26 
SET @Qty=1 


SELECT CAST((ROUND((@[email protected])/@Qty, 2,0)) as DECIMAL(10,2))