偶然我遇到了这个简单的数学方程式,PowerShell出错了.
PS 99.804-99.258
0.546000000000006
PS 10.804-10.258
0.546000000000001
Run Code Online (Sandbox Code Playgroud)
这让我很好奇,我尝试了一些不同的计算器,大多数计算器都正确并返回
0.546
Run Code Online (Sandbox Code Playgroud)
和:
PS 1.804-1.258
0.546
Run Code Online (Sandbox Code Playgroud)
也是对的.但我发现其他计算器也返回了错误的结果:
0.54600000000001
0.545999999999999999
0.5460000000000065
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况?如何在PowerShell中获得正确的结果?
这是因为您的示例中使用的默认类型是System.Double,
99.804.GetType()
>>>>IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Double System.ValueType
Run Code Online (Sandbox Code Playgroud)
在您的特定情况下,您想要使用的是System.Decimal哪个更精确,
[decimal]99.804-[decimal]99.258
>>>>0.546
Run Code Online (Sandbox Code Playgroud)
或者,
99.804d-99.258d
>>>>0.546
Run Code Online (Sandbox Code Playgroud)
更多的信息
我觉得有必要更准确地澄清我的意思.基本上,重要的是要理解double类型具有比decimal类型更大的范围.但是,更大的范围并不意味着更准确.
实际上,System.Decimal最初创建是为了处理货币/货币问题,其中小数点可能是一团糟.它的准确性依赖于它使用基数为10的数学而不是基数为2的数学System.Double.显然,后者计算效率更高,但准确度更低.
这可以在MSDN文档中验证,其中声明,
您可以将
Decimal变量用于货币值.优点是价值的精确性.的Double数据类型是更快,需要较少的存储器,但它受舍入误差.该Decimal数据类型保留完整准确度至28位小数.浮点(
Single和Double)数字的范围大于Decimal数字,但可能会出现舍入误差.浮点类型支持的有效数字较少,Decimal但可以表示更大的数值.