c# - 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 方法时会产生不同的结果,具体取决于它的创建方式,但这并不意味着不能有一些让它以这种方式工作的更有效的论据。任何人都可以为我提供有关此选择的一些见解吗?
为什么框架的创建者认为当前的实现比原来的更好?
解决方案
推荐阅读
- javascript - 通过提供 start 和 endtime 参数从末尾到第一项查询分页 API 端点
- node.js - Jest 自定义测试环境不能使用绝对路径
- drivine - 如何将connectionPooling和超时相关的属性传递给Drivine connectionProvider
- excel - VBA:转换数字格式/刷新单元格
- reactjs - 带有 React UI(脚手架)的 Laravel 8 的 Docker 文件
- c++ - 在点数组中找到最小值的算法
- assembly - ARM 程序集无法从地址加载
- html - html-验证时输入背景颜色更新
- laravel - Laravel Homestead 有多个实例,其中一个说明站点无法访问
- c# - 从接口执行 EF_context.Database.ExecuteSqlRawAsync