7
votes

TSQL - Faire une valeur de flotteur littérale

Je comprends la foule de problèmes dans la comparaison des flotteurs et je déplore leur utilisation dans ce cas - mais je ne suis pas l'auteur de la table et que je n'ai qu'un petit obstacle à gravir ...

Quelqu'un a décidé d'utiliser des flotteurs comme Vous attendez des GUDS à utiliser. J'ai besoin de récupérer tous les enregistrements avec une valeur de flotteur spécifique. xxx

Voici ma tentative naïve: xxx

et voici Une tentative approximativement de travail: xxx

dans ma tentative naïf, est-ce littéral un littéral flottant? Ou est-ce vraiment un littéral décimal qui est converti plus tard?

Si mon littéral n'est pas un littéral à virgule flottante, quelle est la syntaxe pour faire un littéral de point flottant?

Edit: Un autre Possibilité de moi a eu lieu ... Il se peut qu'un nombre plus précis que celui affiché est stocké dans cette colonne. Il peut être impossible de créer un littéral qui représente ce nombre. Je vais accepter des réponses qui démontrent que c'est le cas.


edit: réponse à dvk.

TSQL est la dialecte de MSQLServer de SQL.

Ceci Le script fonctionne et donc l'égalité peut être effectuée de manière déterministe entre les types de flotteurs: xxx

J'ai dit "environ" parce que cette méthode teste une plage. Avec cette méthode, je pourrais obtenir des valeurs qui ne sont pas égales à ma valeur souhaitée.

L'article lié ne s'applique pas car je ne suis pas (intentionnellement) essayant de chevaucher les limites mondiales entre décimales et flottes. J'essaie de travailler avec seulement des flotteurs. Cela ne concerne pas la non-convertibilité des décimales à des flotteurs.


réponse à Zinglon:

une valeur littérale pouvant trouver mes dossiers, merci. xxx


0 commentaires

3 Réponses :


0
votes

Le problème n'est pas de savoir si c'est un point alcoolique flottant ou non.

Le problème est que la comparaison de deux flotteurs pour l'égalité dans Sybase (ou tout serveur DB) n'est pas déterministe, puisque 4.000000000000000000 ... et 3.9999999999999999999999999999999 ... sont les mêmes nombre exact mais ne sont pas égaux.

Votre deuxième solution est la seule façon correcte de comparer des flotteurs pour "égalité" (c'est-à-dire qu'ils sont les mêmes jusqu'à une précision).

Pourquoi dis-tu "Travailler approximativement" sur votre deuxième approche?

Étant donné que vous n'avez pas fourni le serveur DB spécifique que vous utilisez, voici une rédaction assez décente du problème (avec fondamentalement les mêmes conclusions que ci-dessus) pour MySQL

http://dev.mysql.com /doc/refman/5.0/fr/problems-with-float.html


0 commentaires

2
votes

Il est possible que les valeurs soient tronquées sur l'affichage. Je suppose que la colonne n'a pas de contrainte unique à ce sujet, sinon la question serait discutable. Sur ma configuration, SSMS tronque la valeur la plus précise dans ce script. XXX

De même, si ces valeurs sont distinctes, vous pouvez les jeter à binaire (8) et les identifier en fonction de cette valeur, comme Ceci: xxx


0 commentaires

5
votes

est-ce littéral un littéral à virgule flottante? Ou est-ce vraiment une décimale littéral qui est converti plus tard? P>

Si mon littéral n'est pas un littéral à virgule flottante, quelle est la syntaxe pour faire un point alcoolique flottant? P>

Le 0.867153569942739 Code> Littéral dans SQL Server est un type décimal code>, pas float code>. Le moteur choisit automatiquement l'échelle et la précision appropriées pour représenter le littéral donné. P>

Pour écrire un littéral du type CODE> TYPE, vous devez utiliser la notation scientifique, comme ceci: 0.867153569942739E0 CODE> P>

Ceci est documenté dans Constantes (Transact-SQL) P>

Constantes décimales H2>

décimal strong> Les constantes sont représentées par une chaîne de des nombres non fermés entre guillemets et contiennent une décimale point. Voici des exemples de constantes fortes> décimales fortes> p>

SELECT *
FROM MyTable
WHERE convert(binary(8), RandomGrouping) = @Y


0 commentaires