我可能在这里遗漏了一些简单的东西,所以我提前道歉.我也知道可能有更好的方法,所以我也对此持开放态度.
我正在尝试运行一个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
变量中.
再一次,这可能是我忽视的愚蠢/明显的东西,但我似乎无法弄明白.提前感谢您提供的任何见解.
问题是小数部分在隐式使用的数据类型中没有精确表示,导致舍入错误导致您的比较产生意外结果[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)
归档时间: |
|
查看次数: |
380 次 |
最近记录: |