【发布时间】:2017-01-13 16:20:18
【问题描述】:
我有两个关于 .NET 的 decimal 数据类型确定性的问题:
-
decimal类型的计算是跨平台确定性的吗?或者换句话说,decimal类型的数学运算会在所有平台上产生完全相同的结果吗? -
将
decimal数字转换为float或double是否具有跨平台确定性(转换总是会产生完全相同的结果)?
【问题讨论】:
-
看到 Mono 和 Microsoft 实现之间的极端案例存在一些差异,我一点也不感到惊讶......
-
确实,there was a bug in the Mono implementation 与 Windows 相比导致了不同的结果。我会期待其他人。
-
据我所知,这两个问题的答案都可能是肯定的。没有保证。但是,与
decimal的尾随零相关的转换为double存在问题。可能有两个decimal值仅在尾随零的数量上有所不同,因此这两个decimals 被认为是相等的(即使它们具有不同的内部表示),因此当您将它们转换为 @987654333 @,得到的double值是不同的。 补充: 这也证明了转换为double并不总是选择最近的目的地。想要例子吗? -
看到一个例子确实很好:这对我来说听起来不对。
-
@Bathsheba 一个例子:
var a = ((double)200.000000000000000000000M).ToString("R"); var b = ((double)200.0000000000000000000000M).ToString("R"); var c = ((double)200.00000000000000000000000M).ToString("R");。取自late answer here。因为System.Decimal的GetHashCode()实现首先转换为double,然后稍微截断double,所以这里a中涉及的小数点甚至有错误的decimal.GetHashCode()。另外两个有正确的哈希码。
标签: .net floating-point type-conversion decimal deterministic