c# - System.Decimal 是否一致?

标签 c# .net floating-point ieee-754

使用 float 或 double 的浮点计算在硬件上执行,这可能会在不同的体系结构或优化设置上给出不同的结果,如所讨论的 here .

在该线程中简要提到但未完全回答的一件事是 System.Decimal 的情况。有人提到 System.Decimal 可能 用作一致的浮点类型,它会非常慢,并且没有为 .NET (System.Math) 提供的数学函数实现系统.十进制。

我能找到的关于这种类型的唯一其他信息是 Marc Gravell saying它是在软件中实现的,这强烈暗示它确实是一致的。

因此我的问题是:System.Decimal 能否用于在所有硬件平台上获得一致的结果,还是容易出现与 System.Single 和 System.Double 相同的问题?

如果 System.Decimal 是一致的,是否有免费的库为其实现先验函数(cos、sin、tan、sqrt、log 等)?

最佳答案

在所有 .NET 实现上产生相同结果的方式是一致的。

以某种方式保持一致,它将始终代表第 1 号操作的正确结果。任何 float 在表示某些值时都会遇到麻烦。 System.Decimal 只能准确表示那些可以准确表示为十进制值的数字1/3 将不准确地表示为 0.33333...... 并且 cos、sin、tan、sqrt 和 log 的许多结果将是近似值,因为对于任何数字系统(例如十进制或二进制) ) 是很多只能表示为最接近的近似值的值。

C# 规范说: 对 decimal 类型的值进行运算的结果是通过计算精确结果(保留比例,如为每个运算符定义的)然后四舍五入以适合表示的结果。结果四舍五入到最接近的可表示值,当结果同样接近两个可表示值时,四舍五入到最低有效数字位置为偶数的值。

关于c# - System.Decimal 是否一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13835640/

相关文章:

c# - 不包含 'GetAwaiter' 的定义

c# - 使用值属性作为键的字典

c - 对于浮点宏,C 标准的 "converted to its semantic type"是什么意思?

perl 整数算术给出浮点答案

haskell - Haskell中函数 'floor'类型错误

c# - 具有链接和并行工作流程的 Azure Durable 功能

c# - Visual Studio - 引用第三方 DLL

c# - 如何在 C# 中的 foreach 循环内访问集合中的下一个值?

c# - 选项卡更改时刷新/重新加载 MUI WPF 页面

c# - 如何根据 key 同步一段代码?