Powershell比较数组元素

Tom*_*Tom 3 arrays powershell

我可能在这里遗漏了一些简单的东西,所以我提前道歉.我也知道可能有更好的方法,所以我也对此持开放态度.

我正在尝试运行一个PowerShell脚本,它将查看一个值数组,比较它们以查看数组的两个元素之间的差异值.

下面是我用来测试的示例数据集,从CSV导入PowerShell:

1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.7, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.7, 2.9, 3.0

我想要完成的是运行此列表并将第二个条目与第一个条目进行比较,将第三个条目与第二个条目进行比较,将第四个条目与第三个条目进行比较等,$export如果元素的值至少大于0.2 ,则将元素添加到ONLY比前一个元素.

这是我尝试过的:

$import = get-content C:/pathtoCSVfile
$count = $import.Length-1;
$current=0;

Do 
{    
    $current=$current+1;
    $previous=$current-1

    if (($import[$current]-$import[$previous]) -ge 0.2)
    {
        $export=$export+$import[$current]+"`r`n";
    }
} 
until ($current -eq $count)
Run Code Online (Sandbox Code Playgroud)

现在我使用Trace on运行它并且它将值分配给$current$previous运行两个减法,如if每个循环中的条件所描述的那样,但只有2.7($import[14]-$import[13])的值是注册if条件已经遇到了,因此只剩下一个2.7英寸的值$export.我预计其他值(1.7,1.9和2.9)也会添加到$export变量中.

再一次,这可能是我忽视的愚蠢/明显的东西,但我似乎无法弄明白.提前感谢您提供的任何见解.

mkl*_*nt0 5

问题是小数部分在隐式使用的数据类型中没有精确表示,导致舍入错误导致您的比较产生意外结果[double]-ge 0.2.

如果你强迫你的计算,使用[double]类型来代替,问题消失.

应用于更加PowerShell惯用的代码重构(请注意,[decimal]数字文字中的后缀创建一个d实例):

PS> 2.7 - 2.5 -ge 0.2
True  # OK, but only accidentally so, due to the specific input numbers.

PS> 1.7 - 1.5 -ge 0.2
False  # !! Due to the inexact internally binary [double] representation.
Run Code Online (Sandbox Code Playgroud)

以上产量:

PS> 1.7d - 1.5d -ge 0.2d
True # OK - Comparison is now exact, due to [decimal] values.
Run Code Online (Sandbox Code Playgroud)