批量比较 2 个数字时输出错误
Wrong output when comparing 2 numbers in batch
我正在使用批处理文件测试一些东西,以比较 2 个数字是否大于、小于或等于。我开始进行此测试以找出为什么我的其他脚本需要比较 2 个数字并且无法正常工作。在测试期间,我发现了问题,但我不明白为什么会这样。我希望你能帮我解决这个问题。
假设我有 2 个变量:
set a=12.5
set b=10.0
如果我比较这两个数字:
IF %A% GTR %B% (echo A greater than B) ELSE (IF %A% LSS %B% (echo B greater than A) ELSE (echo A equal B))
输出为:A greater than B
我用小数测试了多个数字并且工作正常,EXCEPT 当一个数字小于 10 而另一个数字大于 10 时。
示例:
set a=9.9
set b=12.3
IF %A% GTR %B% (echo A greater than B) ELSE (IF %A% LSS %B% (echo B greater than A) ELSE (echo A equal B))
在这种情况下,输出是:A greater than B
这是错误的。
任何人都可以向我解释为什么会发生这种情况以及如何解决这个问题?
运行 if /?
你会看到
These comparisons are generic, in that if both string1 and string2 are both comprised of all numeric digits, then the strings are converted to numbers and a numeric comparison is performed.
由于像 12.5、10.0、9.9... 这样的十进制数字并非由所有数字组成(它们包含 .
字符),因此它们将保留为字符串并进行比较 lexicographically 就像任何语言中的默认字符串比较一样。由于9大于1,所以“9.9”排在“10.0”之后
事实上,只要比较任何位数不同的数字,您就会看到相同的现象。例如 123.5 将比 34.2
“小”
要比较数字的字典顺序,它们需要具有相同的宽度,这意味着您必须在数字前后填充零,以便小数点前后的长度相同,例如“112.400”和“ 009.987
阅读更多信息
- How to explain sorting (numerical, lexicographical and collation) with examples to non technical testers?
- What is up with number sorting?
- Sorting for Humans : Natural Sort Order
phuclv上面解释的很详细
对于那些正在寻找解决方案的人,您可以在批处理脚本中做 3 件事来比较数字与小数部分:
- 使用PowerShell计算:
See this to know how to use powershell in batch file
- 使用第 3 方 .exe 文件来比较命令行参数中的给定数字。像这样calc.exe,但我不确定它是否支持比较运算符!?无论如何,你可以用简单的 c 语言创建你自己的并将其编译为 .exe 文件。
- 我已经创建了 this function,您可以在批处理脚本中使用它:
以下将 return -1:
decimalCompare.bat 1.215 51.2151
以下将 return -1:
decimalCompare.bat 00001.215 51.2151
以下将 return 0:
decimalCompare.bat 54.1246 54.1246
以下将 return 1:
decimalCompare.bat 112.400 009.987
以下将 return -1:
decimalCompare.bat 112 229.987
我正在使用批处理文件测试一些东西,以比较 2 个数字是否大于、小于或等于。我开始进行此测试以找出为什么我的其他脚本需要比较 2 个数字并且无法正常工作。在测试期间,我发现了问题,但我不明白为什么会这样。我希望你能帮我解决这个问题。
假设我有 2 个变量:
set a=12.5
set b=10.0
如果我比较这两个数字:
IF %A% GTR %B% (echo A greater than B) ELSE (IF %A% LSS %B% (echo B greater than A) ELSE (echo A equal B))
输出为:A greater than B
我用小数测试了多个数字并且工作正常,EXCEPT 当一个数字小于 10 而另一个数字大于 10 时。
示例:
set a=9.9
set b=12.3
IF %A% GTR %B% (echo A greater than B) ELSE (IF %A% LSS %B% (echo B greater than A) ELSE (echo A equal B))
在这种情况下,输出是:A greater than B
这是错误的。
任何人都可以向我解释为什么会发生这种情况以及如何解决这个问题?
运行 if /?
你会看到
These comparisons are generic, in that if both string1 and string2 are both comprised of all numeric digits, then the strings are converted to numbers and a numeric comparison is performed.
由于像 12.5、10.0、9.9... 这样的十进制数字并非由所有数字组成(它们包含 .
字符),因此它们将保留为字符串并进行比较 lexicographically 就像任何语言中的默认字符串比较一样。由于9大于1,所以“9.9”排在“10.0”之后
事实上,只要比较任何位数不同的数字,您就会看到相同的现象。例如 123.5 将比 34.2
“小”要比较数字的字典顺序,它们需要具有相同的宽度,这意味着您必须在数字前后填充零,以便小数点前后的长度相同,例如“112.400”和“ 009.987
阅读更多信息
- How to explain sorting (numerical, lexicographical and collation) with examples to non technical testers?
- What is up with number sorting?
- Sorting for Humans : Natural Sort Order
phuclv上面解释的很详细
对于那些正在寻找解决方案的人,您可以在批处理脚本中做 3 件事来比较数字与小数部分:
- 使用PowerShell计算: See this to know how to use powershell in batch file
- 使用第 3 方 .exe 文件来比较命令行参数中的给定数字。像这样calc.exe,但我不确定它是否支持比较运算符!?无论如何,你可以用简单的 c 语言创建你自己的并将其编译为 .exe 文件。
- 我已经创建了 this function,您可以在批处理脚本中使用它:
以下将 return -1:
decimalCompare.bat 1.215 51.2151
以下将 return -1:
decimalCompare.bat 00001.215 51.2151
以下将 return 0:
decimalCompare.bat 54.1246 54.1246
以下将 return 1:
decimalCompare.bat 112.400 009.987
以下将 return -1:
decimalCompare.bat 112 229.987