【问题标题】:Why do integers in PowerShell compare by digits?为什么 PowerShell 中的整数按数字进行比较?
【发布时间】:2015-09-17 18:20:26
【问题描述】:

我的代码告诉你你猜到的数字是高于还是低于随机生成的数字,但它似乎只在其中一个低于 10 时比较数字的前几位。

[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-Debug $GeneratedNum

$isQuitting = $false
Do{
    [int]$Input = Read-Host "Take a guess!"

    If($Input -lt $GeneratedNum){Write-Output "Too Low"}
    If($Input -gt $GeneratedNum){Write-Output "Too High"}
    If($Input -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true}

} Until($isQuitting -eq $true)

例如$GeneratedNum = 56$Input = 7时,返回"Too High"

【问题讨论】:

  • Read-Host 读取的值是字符串而不是整数。您的变量标记不是看起来的演员。在作业的右侧使用演员表,它似乎可以正常工作。
  • 谢谢!效果很好

标签: powershell comparison operators


【解决方案1】:

这是因为您将字符串与整数进行比较。顺序很重要。

"56" -lt 7

其实是一样的:

"56" -lt "7"

或者:

56 -lt "7"

会给你正确的结果。 PowerShell 尝试将右侧参数强制转换为左侧的类型。

您可以尝试显式转换:

[int]$Input -lt $GeneratedNum

【讨论】:

    【解决方案2】:

    麻烦来自Read-Host返回一个字符串,所以你的演员$InputArrayListEnumeratorSimple尝试:

    [int]$GeneratedNum = Get-Random -min 1 -max 101
    Write-host $GeneratedNum
    
    $isQuitting = $false
    Do{
        $Input = (Read-Host "Take a guess!") -as [int]
    
        If($Input -lt $GeneratedNum){Write-Output "Too Low"}
        If($Input -gt $GeneratedNum){Write-Output "Too High"}
        If($Input -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true}
    
    } Until($isQuitting -eq $true)
    

    您还应该使用try{}catch{} 来捕获输入不是 int 的情况。

    你必须明白的是,当你使用PowerShell比较运算符时,左边部分的类型是被选中的,所以右边部分被转换为左边的类型。知道您可以编写以下内容,我只是将$GeneratedNum 这是比较左侧的整数:

    [int]$GeneratedNum = Get-Random -min 1 -max 101
    Write-host $GeneratedNum
    
    $isQuitting = $false
    Do{
        $Input = (Read-Host "Take a guess!")
    
        If($GeneratedNum -gt $Input){Write-Output "Too Low"}
        If($GeneratedNum -lt $Input){Write-Output "Too High"}
        If($GeneratedNum -eq $Input){Write-Output "Good Job!"; $isQuitting = $true}
    
    } Until($isQuitting -eq $true)
    

    【讨论】:

      【解决方案3】:

      切勿使用与自动变量同名的变量:$input 是自动变量。

      查看这段代码,我在其中管道读取从主机读取的值(并且不要使用$input 变量):

      [int]$GeneratedNum = Get-Random -min 1 -max 101
      Write-Debug $GeneratedNum
      $isQuitting = $false
      Do{
          Read-Host "Take a new guess!" | %{
      
              if($_ -as [int] -gt 0){
                  If($_ -lt $GeneratedNum){Write-Output "Too Low"}
                  If($_ -gt $GeneratedNum){Write-Output "Too High"}
                  If($_ -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true}
              }
          }
      
      } Until($isQuitting -eq $true)
      

      请务必注意,我的代码正确处理错误输入(非数字字符),例如 w 或字符串 (qwerty),这会使其他提案失败。

      我利用了您生成的整数总是大于 0 的事实。

      【讨论】:

        【解决方案4】:

        使用switch

        [int]$GeneratedNum = Get-Random -min 1 -max 101
        Write-Debug $GeneratedNum
        
        :lop Do{
            switch ((Read-Host 'Take a new guess!') -as [int])
            {
                {$_ -eq $null}{continue}
                {$_ -lt $GeneratedNum}{'Too Low';continue}
                {$_ -gt $GeneratedNum}{'Too High';continue}
                {$true}{'Good Job!';break lop}
            }
        
        } while($true)
        

        【讨论】:

          猜你喜欢
          • 2011-06-21
          • 2012-02-09
          • 1970-01-01
          • 1970-01-01
          • 2013-01-02
          • 1970-01-01
          • 2020-09-15
          相关资源
          最近更新 更多