如何在PowerShell中正确比较双精度浮点数?

4

在比较两个double类型时,我注意到以下行为。

给定以下基本脚本:

[double]$maxValue = 1.5
[double]$startValue = 1.2
[double]$counter = $startValue

while ($counter -lt $maxValue) {
    Write-Host $counter
    $counter += 0.1
}

输出:

1.2
1.3
1.4

如果我将while语句改为使用小于等于符号: while ($counter -le $maxValue) {
输出:
1.2
1.3
1.4

这段代码与上面的代码完全相同,因此在结尾处缺少了预期的“1.5”值。

如何在PowerShell中正确比较两个双精度数?

1个回答

8
我建议您不要一开始就使用double。使用System.Decimal(在PowerShell中可能有一个别名-我不确定)。看起来您对精确的十进制值感兴趣,因此请使用适当的类型。
您没有看到1.5的原因是最接近0.1的double比0.1略大......因此您实际上得到的数字是1.2000000001、1.3000000002、1.400000002,然后1.500000003不小于或等于1.5。
有关更多信息,请参见我的文章二进制浮点数十进制浮点数

谢谢,我怀疑是这样的情况,只是无法确定。看起来十进制确实存在,用[decimal]更新代码而不是[double],它按预期工作。 - mundeep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接