首页 > 解决方案 > C#、小数文字、.ToString 和规范化。为什么尾数没有归一化?

问题描述

我的一位同事刚刚让我注意到小数文字和ToString()方法的“奇怪”行为。

考虑这个示例代码。

Console.WriteLine(10M);
Console.WriteLine(10M.ToString());

Console.WriteLine(10.00M);
Console.WriteLine(10.00M.ToString());

输出是:

10
10
10.00
10.00

这不知何故让我“措手不及”,因为我没想到会这样。我虽然每个 WriteLine 调用都会打印出“10”。

在花了一些时间思考这个问题之后,我得出结论,框架可以“存储”有关定义值的小数位数的信息的唯一方法必须与数字所具有的内部尾数/指数表示相关联。

飞碟似乎证实了这一点。

取自:http ://csharpindepth.com/Articles/General/Decimal.aspx

在 .NET 1.0 和 1.1 之间,十进制类型发生了微妙的变化。考虑以下简单程序:

(切)

当我第一次运行上面的(或类似的)时,我希望它只输出 1(这就是它在 .NET 1.0 上的样子)——但实际上,输出是 1.00。十进制类型不会自行规范化 - 它会记住它有多少个十进制数字(通过在可能的情况下保持指数)并且在格式化时,零可能会被视为有效的十进制数字。

因此,这解释了这是如何可能的以及它是何时起源的。我现在的问题是“为什么”。

任何线索为什么这种行为被特别改变为以这种方式工作?只是通过消除标准化的需要来提高性能?对我来说,这似乎是一个奇怪的选择——这意味着相同的数字(尽管具有不同的表示)在传递给 ToString 方法时会产生不同的结果,具体取决于它的创建方式,但这并不意味着不能有一些让它以这种方式工作的更有效的论据。任何人都可以为我提供有关此选择的一些见解吗?

为什么框架的创建者认为当前的实现比原来的更好?

标签: c#floating-pointdecimaltostring

解决方案


推荐阅读