powershell - 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 中获得正确的结果?
解决方案
这是因为您的示例中使用的默认类型是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 位。浮点 (
Single
和Double
) 数字的范围比Decimal
数字大,但可能会出现舍入错误。浮点类型支持的有效数字少于Decimal
但可以表示更大的值。
推荐阅读
- ios - 具有相同 bundleID 的应用程序将具有相同的沙盒?
- java - 有没有办法使用 maven api 将 maven 项目打包到 jar 中?
- angular - 如何防止 angular-4 应用程序中的点击劫持攻击?
- javascript - AJAX 调用后 onload 不工作
- git - 在推入 Golang 之前运行测试
- python - 如何从 div 标签中提取强数据?
- windows - 是否可以在不链接到 c 库且不使用 ExitProcess() 的情况下从汇编代码创建 Windows exe?
- image - 暴露图像的 Web 服务:ddl 还是 base64?
- java - Hibernate 生成带有多对一关联的额外左连接
- ms-access - MS 访问 - 总和