在幕后,C#/ .NET中十进制值类型发生了什么?

Hay*_*mey 18 c# primitive types decimal

decimal类型是如何实现的?

更新

  • 它是128位值类型(16字节)
  • 1个符号位
  • 尾数为96位(12字节)
  • 指数为8位
  • 剩余的比特(其中23个!)设置为0

谢谢!我会坚持使用64位长的自己隐含的比例.

Jes*_*lon 8

维基百科上的Decimal Floating Point文章,其中包含有关此文章的特定链接System.Decimal.

十进制存储在128位中,即使只有102也是必需的.将十进制视为表示尾数的三个32位整数,然后是表示符号和指数的一个整数是很方便的.最后一个整数的最高位是符号位(以正常方式,位为负数设置(1))和位16-23(高16位字的低位)包含指数.其他位必须全部清零(0).此表示形式是decimal.GetBits(decimal)给出的表示形式,返回4个整数的数组.

  • 抛出新的SomeOneDoesntKnowJonSkeetException(); (7认同)
  • @Jouke:不需要`try/catch`块,它永远不会抛出. (2认同)

Ber*_*ron 7

来自C# 语言规范

\n\n
\n

decimal类型是适合金融和货币计算的 128 位数据类型。
\n 该decimal类型可以表示范围从 1.0 \xc3\x97 10 \xe2\x88\x9228到大约 7.9 \xc3\x97 10 28的值,具有 28-29 个有效数字。

\n\n

type 的有限值集的decimal形式为 (\xe2\x80\x931) s \xc3\x97 c \xc3\x97 10 - e,其中符号s为 0 或 1,系数c由 0 \ xe2\x89\xa4 c < 2 96,小数位数e为 0 \xe2\x89\xa4 e \xe2\x89\xa4 28。
\n 该decimal类型不支持有符号零、无穷大或 NaN\'s 。Adecimal表示为按 10 的幂缩放的 96 位整数。对于绝对值小于 1.0m 的小数,该值精确到小数点后第 28 位但不再保留。

\n\n

对于绝对值大于或等于1.0m的小数,该值精确到28或29位。与floatdouble数据类型相反,十进制小数(例如 0.1)可以用十进制表示形式精确表示。\n 在floatdouble表示形式中,此类数字通常是无限分数,使得这些表示形式更容易出现舍入错误。

\n\n

如果二元运算符的操作数之一为 类型decimal,则另一个操作数必须为整型或 类型decimal。如果存在整型操作数,则decimal在执行操作之前将其转换为整型。

\n\n

对类型值进行运算的结果decimal是计算精确结果(保留为每个运算符定义的比例)然后舍入以适合表示的结果。结果将四舍五入到最接近的可表示值,并且当结果同样接近两个可表示值时,四舍五入到最低有效数字位置中具有偶数的值(这称为 \xe2\x80\x9cbanker\xe2\ x80\x99s 舍入\xe2\x80\x9d)。零结果的符号始终为 0,小数位数为 0。

\n\n

如果十进制算术运算产生的值的绝对值小于或等于 5 \xc3\x97 10 -29,则运算结果为零。如果十进制算术运算产生的结果对于格式来说太大,则会抛出decimala 。System.OverflowException

\n\n

decimal类型比浮点类型具有更高的精度,但范围更小。因此,从浮点类型到 的转换decimal可能会产生溢出异常,而从decimal浮点类型到浮点类型的转换可能会导致精度损失。由于这些原因,浮点类型 和 之间不存在隐式转换,并且如果没有显式强制转换,则不可能在同一表达式中decimal混合浮点和操作数。decimal

\n
\n