PowerShell计算错误

时间:2018-07-30 12:11:41

标签: powershell math

偶然地,我遇到了一个简单的数学方程,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中获得正确的结果?

1 个答案:

答案 0 :(得分:5)

这是因为示例中使用的默认类型为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最初是为解决货币/货币问题而创建的,在这种情况下,小数点可能很乱。 精确度取决于以下事实:System.Double 使用10进制数学而不是2进制数学。显然,后者的计算效率更高,但准确性更低。

这可以在MSDN documentation此处进行验证,

  

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

     

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