Pregunta

Quiero convertir un tipo de datos de dinero a un decimal, porque quiero registrar los resultados a 8 decimales.

Por ejemplo, en una tabla de tasa de cambio, veo la tasa almacenada como 2871047428.20 como un tipo de datos de dinero; usando Microsoft SQL Management Studio, quiero dividir eso entre 10000000 para lograr el resultado 287.10474282; sin embargo, el resultado que realmente estoy obteniendo es 287.1047.

Creo que la razón por la que obtengo solo los 4 decimales es porque es un tipo de datos de dinero y, por lo tanto, creo que el camino a seguir es convertir esto en un tipo de datos decimal ...

¿Fue útil?

Solución

Aquí una columna de comparación a la izquierda del valor decimal, la columna de la derecha el valor monetario calculado:

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

Consulte también aquí sobre Desbordamiento de pila:

Otros consejos

La respuesta de

splattne es casi correcta, excepto por dos cambios menores:

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

Esto dará la respuesta correcta: 287.10474282. Lo que hice fue cambiar el valor de precisión y agregar el " .0 " al valor de división.

Lo único que me desconcierta en este momento es el hecho de que tengo que convertir el valor como decimal (34,6) en lugar del decimal esperado (34,8).

Entonces, escribí la consulta de otra manera, lo que tiene más sentido para mí:

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

Vea cuál funciona para usted.

Todos ustedes están golpeando rarezas de división decimal Aquí está mi respuesta a otro hilo, T-SQL Decimal Division Accuracy

Y también puede tener conversiones flotantes implícitas debido a precedencia de tipo de datos si usa 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 ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top