Windows fichier de commandes SI échec - Comment pouvez-30000000000000 l'égalité des 40000000000?
SI donne la mauvaise réponse quand j'essaie de comparer les 2 grands nombres.
Par exemple, ce simple fichier batch
@echo off
setlocal
set n1=30000000000000
set n2=40000000000
if %n1% gtr %n2% echo %n1% is greater than %n2%
if %n1% lss %n2% echo %n1% is less than %n2%
if %n1% equ %n2% echo %n1% is equal to %n2%
produit
30000000000000 is equal to 40000000000
Ce qui se passe, et comment puis-je résoudre ce problème?
OriginalL'auteur dbenham | 2012-02-02
Vous devez vous connecter pour publier un commentaire.
Si les deux côtés d'une SI comparaison sont composés uniquement de chiffres après la virgule, puis SI s'interpréter à la fois sur les côtés, comme des numéros. C'est ce qui permet de S'déterminer correctement que 10 est supérieure à 9. Si vous avez des chiffres non caractères, alors SI ne une comparaison de chaînes de caractères. Par exemple, "10" est inférieur à "9" parce que les citations ne sont pas des chiffres, et 1 sortes inférieur à 9.
La raison de la comparaison à la question échoue est parce que CMD.EXE ne peut pas traiter des nombres supérieurs de 2 147 483 647. Une drôle de conception de la bizarrerie dans SI la traite n'importe quel nombre plus grand que 2147483647 comme étant égal à 2 147 483 647.
Si vous voulez faire une comparaison de chaîne de grands nombres, alors la solution est simple. Vous avez juste besoin d'ajouter 1 ou plusieurs chiffres sur les deux côtés de l'état. Le script suivant -
produit de la chaîne correcte résultat de la comparaison
Mais dans la plupart des cas, ce n'est pas ce qui est voulu.
Si vous voulez faire une comparaison numérique, alors le processus est un peu plus compliqué. Vous avez besoin de convertir le nombre en une chaîne de caractères qui permet de trier correctement comme un nombre. Ceci est accompli par la préfixation de la chaîne numérique avec des zéros dans une manière qui le rend à la fois les chaînes numériques de la même largeur. La solution la plus simple est de déterminer le nombre maximum de chiffres vous avez besoin de soutien, disons 15 pour cet exemple. Si vous préfixe de chaque valeur de 15 zéros, puis de ne conserver que le plus à droite 15 caractères en utilisant une sous-chaîne de l'opération. Vous devez également ajouter un chiffre à la fois sur les côtés, comme avant - nouveau devis travaux.
Ce script -
produit -
Noter que gauche préfixant avec des espaces fonctionne tout aussi bien que des zéros.
Vous pouvez par la suite supprimer les zéros à chaque fois que vous le souhaitez à l'aide de la suite (ou de s'adapter à supprimer les espaces)
Normalement nous n'avons pas traiter avec un grand nombre dans des fichiers batch. Mais ils peuvent facilement surgir si l'on regarde l'espace libre sur un disque dur. To les disques durs sont relativement bon marché. C'est de cette façon j'ai d'abord couru en comparaison du grand nombre de participants à https://stackoverflow.com/a/9099542/1012053
J'ai choisi de soutenir 15 chiffres dans mon exemple parce que cela équivaut à presque 999 téraoctets. J'imagine qu'il faudra un certain temps avant que nous avons à traiter avec les lecteurs de disque plus grand que cela. (Mais qui sait!)
MODIFIER - Mon description de la façon dont S'analyse des numéros de est volontairement simpliste. SI en charge par les nombres négatifs, ainsi que hexadécimal et octal notation. Voir Des règles sur la façon CMD.EXE analyse des numéros de pour une explication plus approfondie.
Comparaison numérique est effectué si les deux côtés sont bien formés nombre, pas seulement strictement chiffres après la virgule. Par exemple -1 ou 0xabc ou +43 comparer numériquement, mais 09 (09 est pas valide octal).
Absolument correct, mais je ne voulais pas détourner l'attention du point central de la Q&A sur un grand nombre. J'ai eu du mal à venir avec une explication concise qui ne serait pas submerger le point sur un grand nombre d'être traités comme le max autorisé entier. Plus d'infos sont disponibles sur les Règles pour savoir comment CMD.EXE analyse des nombres
J'ai tenu compte de vos point avec un edit à la fin.
Compris. Ne veux pas être tâtillon, mais j'ai été mordu récemment par "strictement chiffres après la virgule", ayant des zéros de gauche et attend une comparaison numérique. J'ai toujours vraiment détesté le soutien de l'octal (C ou CMD ou n'importe quelle langue) via un zéro sur un multi-chiffres. Je suppose que c'est difficile de se débarrasser de l'héritage des représentations.
OriginalL'auteur dbenham