Почему десятичная дробь C# использует двоичное целочисленное значение?
Новый 128-битный десятичный тип с плавающей запятой IEEE https://en.wikipedia.org/wiki/Decimal128_floating-point_format указывает, что мантисса может быть представлена одним из двух способов, либо как простое двоичное целое число, либо в плотно упакованном десятичном формате (в этом случае каждые десять бит представляют три десятичных цифры).
C# decimal
type предшествует этому стандарту, но имеет ту же идею. Он пошел с двоичным целочисленным значащим.
На первый взгляд это кажется неэффективным; для сложения и вычитания, чтобы выровнять значения, вам нужно разделить одно из них в степени десяти; а деление - самый затратный из всех арифметических операторов.
Что послужило причиной выбора? Какое соответствующее преимущество стоило этого штрафа?
1 ответ
Выбор одного представления почти всегда сводится к компромиссу.
От сюда
Двоичное кодирование по своей сути менее эффективно для преобразований в данные с десятичной кодировкой или из них, таких как строки (ASCII, Unicode и т. Д.) И BCD. Поэтому двоичное кодирование лучше всего выбирать только тогда, когда данные являются двоичными, а не десятичными. IBM опубликовала непроверенные данные о производительности.
Здесь вы можете узнать больше об относительной производительности.
По сути, он утверждает ваши мысли, что десятичное значащее, как правило, быстрее, но большинство операций показывают аналогичную производительность и двоичные даже выигрывают при делении. Также имейте в виду, поскольку Intel в основном полагается на двоичные значения (я не смог найти подсказок о других производителях), они с большей вероятностью получат поддержку оборудования и могут с большим отрывом превзойти десятичные дроби.