Question

Je souhaite convertir un type de données monétaire en un nombre décimal, car je souhaite enregistrer les résultats avec 8 décimales.

Par exemple, dans une table de taux de change, le taux stocké sous le nom 2871047428.20 est un type de données monétaire; en utilisant Microsoft SQL Management Studio, je veux diviser cela par 10000000 afin d’obtenir le résultat 287.10474282; Cependant, le résultat obtenu est de 287,1047.

Je pense que la raison pour laquelle je n’obtiens que 4 décimales est parce qu’il s’agit d’un type de données money. Par conséquent, je pense que la voie à suivre consiste à convertir cela en un type de données décimal ....

Était-ce utile?

La solution

Ici, la colonne de comparaison contient la valeur décimale, la colonne de droite, la valeur monétaire calculée:

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

Voir aussi ici sur le dépassement de capacité:

Autres conseils

La réponse de Splattne est presque correcte, à l'exception de deux modifications mineures:

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

Ceci donnera la réponse correcte: 287.10474282. Ce que j’ai fait est de changer la valeur de précision et d’ajouter le code " .0 " à la valeur de la division.

La seule chose qui me laisse perplexe pour le moment est le fait que je dois convertir la valeur en décimal (34,6) au lieu du nombre décimal attendu (34,8).

J'ai donc écrit la requête d'une autre manière, ce qui me semble plus logique:

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

Veuillez voir lequel fonctionne pour vous.

Vous êtes tous frappés par des bizarreries de division décimale Voici ma réponse à autre fil, Exactitude de la division décimale T-SQL

Vous pouvez également avoir des conversions flottantes implicites en raison de la priorité du type de données si vous utilisez 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 ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top