gpt4 book ai didi

arrays - Powershell 比较数组元素

转载 作者:行者123 更新时间:2023-12-01 08:12:39 26 4
gpt4 key购买 nike

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

我正在尝试运行一个 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

What I'm trying to accomplish is running through this list and comparing the second entry with the first, the third with the second, fourth with the third, etc, adding the element to $export ONLY if it has a value that is at least 0.2 greater than the previous element.

Here's what I've tried:

$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)

现在我在 Trace 开启的情况下运行它,它为 $current$previous 赋值,并按照 中的描述运行两者的减法if 条件在每个循环中通过,但仅针对 2.7 ($import[14]-$import[13]) 的值是否注册满足 if 条件,因此在 $export 中只留下一个值 2.7。我希望将其他值(1.7、1.9 和 2.9)也添加到 $export 变量中。

同样,这可能是我忽略的一些愚蠢/明显的事情,但我似乎无法弄清楚。提前感谢您提供的任何见解。

最佳答案

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

一个带有 [double] 值的简单示例,这些值是 PowerShell 隐式使用带有小数点的数字文字:

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.

如果您强制计算使用[decimal] type相反,问题就消失了。

应用于上述示例(将 d 附加到 PowerShell 中的数字文字使其成为 [decimal]):

PS> 1.7d - 1.5d -ge 0.2d
True # OK - Comparison is now exact, due to [decimal] values.

应用于更符合 PowerShell 习惯的代码重构的上下文中:

# Sample input; note that floating-point number literals such as 1.0 default to [double]
# Similarly, performing arithmetic on *strings* that look like floating-point numbers
# defaults to [double], and Import-Csv always creates string properties.
$numbers = 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

# Collect those array elements that are >= 0.2 than their preceding element
# in output *array* $exports.
$exports = foreach ($ndx in 1..($numbers.Count - 1)) {
if ([decimal] $numbers[$ndx] - [decimal] $numbers[$ndx-1] -ge 0.2d) {
$numbers[$ndx]
}
}

# Output the result array.
# To create a multi-line string representation, use $exports -join "`r`n"
$exports

以上结果:

1.7
1.9
2.7
2.9

关于arrays - Powershell 比较数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50899982/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com