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. P> Voici ma tentative naïve: p> et voici Une tentative approximativement de travail: p> 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? P> Si mon littéral n'est pas un littéral à virgule flottante, quelle est la syntaxe pour faire un littéral de point flottant? P> 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. P> edit: réponse à dvk. P> TSQL est la dialecte de MSQLServer de SQL. P> Ceci Le script fonctionne et donc l'égalité peut être effectuée de manière déterministe entre les types de flotteurs: p> 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. P> 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. P> réponse à Zinglon: p> une valeur littérale pouvant trouver mes dossiers, merci. P>
3 Réponses :
Le problème n'est pas de savoir si c'est un point alcoolique flottant ou non. P>
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. P>
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). P>
Pourquoi dis-tu "Travailler approximativement" sur votre deuxième approche? P>
É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 P>
http://dev.mysql.com /doc/refman/5.0/fr/problems-with-float.html p>
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. De même, si ces valeurs sont distinctes, vous pouvez les jeter à binaire (8) et les identifier en fonction de cette valeur, comme Ceci: p>
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