Domanda

Voglio convertire un tipo di dati in denaro in un decimale, perché voglio registrare i risultati in 8 cifre decimali.

Ad esempio, in una tabella dei tassi di cambio vedo il tasso memorizzato come 2871047428,20 come tipo di dati in denaro; usando Microsoft SQL Management Studio, voglio dividerlo per 10000000 per ottenere il risultato 287.10474282; tuttavia il risultato che sto effettivamente ottenendo è 287.1047.

Credo che il motivo per cui sto ottenendo solo le 4 cifre decimali sia perché si tratta di un tipo di dati in denaro, e quindi penso che la via da seguire sia convertire questo in un tipo di dati decimale ....

È stato utile?

Soluzione

Qui un confronto ha lasciato nella colonna il valore decimale, nella colonna a destra il valore del denaro calcolato:

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

Vedi anche qui su Stack Overflow:

Altri suggerimenti

La risposta di splattne è quasi corretta, tranne per due piccole modifiche:

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

Questo darà la risposta corretta: 287.10474282. Quello che ho fatto è stato cambiare il valore di precisione e aggiungere il ".0" al valore di divisione.

L'unica cosa che mi confonde in questo momento è il fatto che devo lanciare il valore come decimale (34,6) anziché come decimale previsto (34,8).

Quindi, ho scritto la query in un altro modo, il che ha più senso per me:

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

Vedi quale funziona per te.

State tutti colpendo le stranezze della divisione decimale Ecco la mia risposta a un altro thread, Precisione divisione decimale T-SQL

E potresti avere anche conversioni float implicite a causa della precedenza del tipo di dati se si utilizza 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 ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top