.NET Decimal 类型计算是确定性的吗?

Are .NET Decimal type computations deterministic?

提问人:zigzag 提问时间:9/6/2016 最后编辑:phuclvzigzag 更新时间:3/19/2021 访问量:769

问:

我有两个关于的问题。NET的数据类型确定性:decimal

  1. 类型计算是否具有跨平台确定性?或者换句话说,对类型的数学运算是否会在所有平台上产生完全相同的结果?decimaldecimal

  2. 强制转换数是确定性的还是跨平台的确定性(强制转换总是会产生完全相同的结果)?decimalfloatdouble

.NET 浮点类型 转换 十进制 确定性

评论

8赞 Jon Skeet 9/6/2016
如果看到 Mono 和 Microsoft 实现之间在极端情况下存在一些差异,我一点也不会感到惊讶......
2赞 Matthew Watson 9/6/2016
事实上,Mono 实现中存在一个错误,导致与 Windows 实现的结果不同。我期待其他人。
0赞 Jeppe Stig Nielsen 9/6/2016
据我所知,这两个问题的答案可能是肯定的。不保证。但是,与 的尾随零相关的转换存在问题。可能有两个值仅相差尾随零的数量,因此这两个 s 被认为是相等的(即使它们具有不同的内部表示),因此当您将它们转换为 时,结果值是不同的。加法:这也证明,转换到并不总是选择最近的目的地。想要例子吗?doubledecimaldecimaldecimaldoubledoubledouble
0赞 Bathsheba 9/6/2016
看到一个例子确实很好:这对我来说听起来不对。
1赞 Jeppe Stig Nielsen 9/6/2016
@Bathsheba 举个例子:.摘自此处的后期回答。因为实现的工作原理是先转换到然后截断该位,所以这里涉及的小数甚至有错误的.另外两个具有正确的哈希码。var a = ((double)200.000000000000000000000M).ToString("R"); var b = ((double)200.0000000000000000000000M).ToString("R"); var c = ((double)200.00000000000000000000000M).ToString("R");System.DecimalGetHashCode()doubledoubleadecimal.GetHashCode()

答:

0赞 Blindy 3/19/2021 #1

对这个问题的评论中有很多散布恐惧的内容。

首先,人们担心过去的某个时候会出现某个 Mono 错误。这不仅已经修复,而且在 2021 年不要使用 Mono。.Net Core 和 .Net5 是完全跨平台的。

然后,人们担心可能会为不相等的十进制实例返回相等的值。是的,这就是(事实上,所有哈希函数)的工作方式,否则您可以将任何任意数据类型压缩为 4 个字节。我建议不要打字,而是读一本关于哈希的书。GetHashCodeGetHashCode

对于OP来说,没有必要听这些人的话,也没有必要重新发明。使用起来非常安全。decimal

评论

0赞 Blindy 3/19/2021
GetHashCode can return true for non-equal decimal instances无需改写。重读?
0赞 Blindy 3/19/2021
好的,希望澄清有助于 OP 更好地了解状态。decimal