提问人:zigzag 提问时间:9/6/2016 最后编辑:phuclvzigzag 更新时间:3/19/2021 访问量:769
.NET Decimal 类型计算是确定性的吗?
Are .NET Decimal type computations deterministic?
问:
我有两个关于的问题。NET的数据类型确定性:decimal
类型计算是否具有跨平台确定性?或者换句话说,对类型的数学运算是否会在所有平台上产生完全相同的结果?
decimal
decimal
强制转换数是确定性的还是跨平台的确定性(强制转换总是会产生完全相同的结果)?
decimal
float
double
答:
0赞
Blindy
3/19/2021
#1
对这个问题的评论中有很多散布恐惧的内容。
首先,人们担心过去的某个时候会出现某个 Mono 错误。这不仅已经修复,而且在 2021 年不要使用 Mono。.Net Core 和 .Net5 是完全跨平台的。
然后,人们担心可能会为不相等的十进制实例返回相等的值。是的,这就是(事实上,所有哈希函数)的工作方式,否则您可以将任何任意数据类型压缩为 4 个字节。我建议不要打字,而是读一本关于哈希的书。GetHashCode
GetHashCode
对于OP来说,没有必要听这些人的话,也没有必要重新发明。使用起来非常安全。decimal
评论
0赞
Blindy
3/19/2021
GetHashCode can return true for non-equal decimal instances
无需改写。重读?
0赞
Blindy
3/19/2021
好的,希望澄清有助于 OP 更好地了解状态。decimal
评论
double
decimal
decimal
decimal
double
double
double
var a = ((double)200.000000000000000000000M).ToString("R"); var b = ((double)200.0000000000000000000000M).ToString("R"); var c = ((double)200.00000000000000000000000M).ToString("R");
System.Decimal
GetHashCode()
double
double
a
decimal.GetHashCode()