gpt4 book ai didi

c# - .NET “decimal” 算法是否独立于平台/体系结构?

转载 作者:可可西里 更新时间:2023-11-01 03:03:57 25 4
gpt4 key购买 nike

我最近询问了 System.Double,并被告知计算可能因平台/架构而异。不幸的是,我找不到任何信息来告诉我这是否适用于 System.Decimal

对于任何特定的 decimal 计算,无论平台/架构如何,我都能保证完全得到相同的结果吗?

最佳答案

Am I guaranteed to get exactly the same result for any particular decimal computation independently of platform/architecture?

C# 4 规范 明确指出,您获得的 在任何平台上的计算都是相同的。

正如 LukeH 的回答指出的那样,C# 2 规范的 ECMA 版本为一致性实现提供了余地以提供更高的精度,因此在另一个平台上实现 C# 2.0 可能会提供更高精度的答案。

为了这个答案的目的,我将只讨论 C# 4.0 指定的行为。

C# 4.0 规范说:


The result of an operation on values of type decimal is that which would result from calculating an exact result (preserving scale, as defined for each operator) and then rounding to fit the representation. Results are rounded to the nearest representable value, and, when a result is equally close to two representable values, to the value that has an even number in the least significant digit position [...]. A zero result always has a sign of 0 and a scale of 0.


由于操作的精确值的计算在任何平台上都应该相同,并且舍入算法定义明确,因此无论平台如何,结果值都应该相同。

但是,请注意关于零的括号和最后一句话。可能不清楚为什么需要该信息。

十进制系统的一个奇怪之处在于几乎每个数量都有不止一种可能的表示形式。考虑精确值 123.456。小数是 96 位整数、1 位符号和表示从 -28 到 28 之间的数字的八位指数的组合。这意味着精确值 123.456 可以用小数 123456 x 10- 3 或 1234560 x 10-4 或 12345600 x 10-5规模很重要。

C# 规范还规定了如何计算比例信息。文字 123.456m 将被编码为 123456 x 10-3,而 123.4560m 将被编码为1234560 x 10-4

观察此功能的实际效果:

decimal d1 = 111.111000m;
decimal d2 = 111.111m;
decimal d3 = d1 + d1;
decimal d4 = d2 + d2;
decimal d5 = d1 + d2;
Console.WriteLine(d1);
Console.WriteLine(d2);
Console.WriteLine(d3);
Console.WriteLine(d4);
Console.WriteLine(d5);
Console.WriteLine(d3 == d4);
Console.WriteLine(d4 == d5);
Console.WriteLine(d5 == d3);

这产生

111.111000
111.111
222.222000
222.222
222.222000
True
True
True

请注意如何在小数运算中保留有关重要零数字的信息,并且 decimal.ToString 知道这一点并在可能的情况下显示保留的零。还要注意小数相等性如何知道根据精确值进行比较,即使这些值具有不同的二进制和字符串表示形式。

我认为规范实际上并没有说 decimal.ToString() 需要根据它们的比例正确地打印出带有尾随零的值,但如果不这样做,实现将是愚蠢的;我会认为这是一个错误。

我还注意到CLR实现中小数的内部存储格式是128位,分割为:16个未使用位,8个比例位,7个未使用位,1个符号位和96个尾数位。这些位在内存中的确切布局未由规范定义,如果另一个实现想要将其他信息填充到这 23 个未使用的位中以用于其自己的目的,它可以这样做。在 CLR 实现中,未使用的位应该始终为零。

关于c# - .NET “decimal” 算法是否独立于平台/体系结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5018187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com