偶然地,我遇到了一个简单的数学方程,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中获得正确的结果?
答案 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个小数位。浮点数(
Single
和Double
)的范围比Decimal
数字大,但可能会舍入错误。浮点类型支持的有效位数少于Decimal
,但可以表示更大的值。