首页 > 解决方案 > PowerShell 计算错误

问题描述

偶然我遇到了这个简单的数学方程,PowerShell 出错了。

PS 99.804-99.258
0.546000000000006

PS 10.804-10.258
0.546000000000001

这让我很好奇,我尝试了一些不同的计算器,大多数计算器都正确并返回

0.546

和:

PS 1.804-1.258
0.546

也是正确的。但我发现其他计算器也返回了错误的结果:

0.54600000000001
0.545999999999999999
0.5460000000000065

为什么会发生这种情况,如何在 PowerShell 中获得正确的结果?

标签: powershellmath

解决方案


这是因为您的示例中使用的默认类型是System.Double,

99.804.GetType()

>>>>IsPublic IsSerial Name                                    BaseType
    -------- -------- ----                                    --------
    True     True     Double                                  System.ValueType

在您的特定情况下,您想要使用的System.Decimal是更精确的,

[decimal]99.804-[decimal]99.258

>>>>0.546

或者,

99.804d-99.258d

>>>>0.546

更多信息

我觉得有必要澄清我所说的更精确的意思。基本上,重要的是要了解double类型的范围比类型大得多decimal。但是,更大的范围并不意味着更准确。

实际上,System.Decimal最初是为了解决小数点混乱的货币/货币问题而创建的。它的精确性在于它使用 base-10 数学而不是 base-2 数学System.Double。显然,后者的计算效率更高,但准确性较低。

这可以在MSDN 文档中进行验证,其中指出,

您可以将Decimal变量用于货币值。优点是值的精度。数据类型速度更快,需要的Double内存更少,但会出现舍入错误。Decimal数据类型保持完全精确到小数点后 28 位。

浮点 (SingleDouble) 数字的范围比Decimal数字大,但可能会出现舍入错误。浮点类型支持的有效数字少于Decimal但可以表示更大的值。


推荐阅读