为什么C#的十进制使用二进制整数有效位?

Why does C#'s decimal use binary integer significand?

新的 IEEE 128 位十进制浮点类型 https://en.wikipedia.org/wiki/Decimal128_floating-point_format 指定有效数(尾数)可以用两种方式之一表示,可以是简单的二进制整数,也可以是密集的十进制 (在这种情况下,每十位代表三个十进制数字)。

C# 的 decimal 类型早于此标准,但具有相同的想法。它带有二进制整数有效位。

从表面上看,这似乎效率低下;对于加法和减法,要排列有效数,您必须将其中一个除以十的幂;除法是所有算术运算符中最昂贵的。

选择的原因是什么?什么相应的优势被认为值得惩罚?

选择一种表示几乎总是要权衡取舍。

来自here

A binary encoding is inherently less efficient for conversions to or from decimal-encoded data, such as strings (ASCII, Unicode, etc.) and BCD. A binary encoding is therefore best chosen only when the data are binary rather than decimal. IBM has published some unverified performance data.

Here您可以找到更多关于相对性能的信息。

基本上,它断言了您的想法,小数位通常更快,但大多数运算显示出相似的性能,二进制甚至在除法中获胜。另请记住,由于英特尔似乎主要依赖二进制有效值(我找不到有关其他制造商的提示),因此他们更有可能获得硬件支持,并且可能大大超过小数。