В SQL как я могу преобразовать денежный тип данных в десятичный?

StackOverflow https://stackoverflow.com/questions/638290

  •  10-07-2019
  •  | 
  •  

Вопрос

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

Например, в таблице курсов валют я вижу курс, сохраненный как 2871047428,20 в качестве денежного типа данных;используя Microsoft SQL Management Studio, я хочу разделить это на 10000000, чтобы получить результат 287.10474282;однако результат, который я на самом деле получаю, равен 287.1047.

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

Это было полезно?

Решение

Здесь для сравнения в левом столбце указано десятичное значение, в правом столбце - рассчитанное денежное значение:

DECLARE @money AS money
SET @money = 2871047428.20
SELECT CAST(@money AS decimal(34,4)) / 10000000, @money / 10000000

Смотрите также здесь о переполнении стека:

Другие советы

ответ Сплатне почти верный, за исключением двух незначительных изменений:

DECLARE @money AS money
SET @money = 2871047428.20
SELECT CAST(@money AS decimal(34,6)) / 10000000.0, @money / 10000000.0

Это даст правильный ответ: 287.10474282. Я изменил значение точности и добавил " .0 " до значения деления.

Единственное, что меня сейчас озадачивает, так это то, что мне нужно привести значение как десятичное (34,6) вместо ожидаемого десятичного (34,8).

Итак, я написал запрос по-другому, что для меня более логично:

DECLARE @money AS money
SET @money = 2871047428.20
SELECT CAST((@money / 10000000.0) AS decimal(34,8)), @money / 10000000.0

Пожалуйста, посмотрите, какой из них работает для вас.

Вы все поражаете странностями десятичного деления Вот мой ответ на другой поток, Точность десятичного деления T-SQL

И у вас также могут быть неявные преобразования с плавающей запятой из-за приоритета типа данных если вы используете 10000000.0

DECLARE @money AS money
SET @money = 2871047428.20
--Oddities
SELECT
    CAST(@money AS decimal(34,8)) / 10000000,
    CAST(@money AS decimal(34,8)) / 10000000.0,
    CAST(@money AS decimal(34,8)) / 10000000.00,
    CAST(@money AS decimal(34,8)) / 10000000.000,
    CAST(@money AS decimal(34,8)) / 10000000.0000
--Should be safe. My brain hurts if I work through p and s
SELECT
    CAST(@money AS decimal(38,8)) / CAST(10000000 AS decimal(8,0))
    SELECT CAST(currency_rate AS decimal) / 10000000 FROM ...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top