21

类型是如何decimal实现的?

更新

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

谢谢!我将坚持使用 64 位长度和我自己的隐含比例。

4

6 回答 6

10

Wikipedia 上的Decimal Floating Point文章,带有指向这篇文章的特定链接System.Decimal

十进制以 128 位存储,尽管只有 102 位是绝对必要的。很方便将小数视为三个 32 位整数表示尾数,然后一个整数表示符号和指数。最后一个整数的最高位是符号位(以正常方式,该位被设置为 (1) 用于负数)和位 16-23(高 16 位字的低位)包含指数。其他位必须全部清零 (0)。这种表示是由 decimal.GetBits(decimal) 给出的,它返回一个 4 个整数的数组。

于 2010-07-20T20:40:00.850 回答
2

来自C# 语言规范

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

type 的有限值集decimal的形式为 (–1) s × c × 10 - e,其中符号s为 0 或 1,系数c由 0 ≤ c < 2 96给出,尺度e为使得 0 ≤ e ≤ 28。
decimal类型不支持带符号的零、无穷大或 NaN。Adecimal表示为 96 位整数,按 10 次方缩放。对于绝对值小于 1.0m 的小数,该值精确到小数点后 28,但不能再进一步。

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

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

对类型值进行decimal运算的结果是通过计算精确结果(保留为每个运算符定义的比例)然后四舍五入以适应表示的结果。结果四舍五入到最接近的可表示值,并且当结果同样接近两个可表示值时,四舍五入到在最低有效数字位置具有偶数的值(这称为“银行家四舍五入”)。零结果的符号始终为 0,标度为 0。

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

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

于 2010-07-20T20:41:21.267 回答
1

如 MSDN 的十进制结构页面所述,网址为http://msdn.microsoft.com/en-us/library/system.decimal(VS.80).aspx

Decimal 值的二进制表示由 1 位符号、96 位整数和用于划分 96 位整数并指定它的哪一部分是小数部分的比例因子组成。比例因子是隐含的数字 10,指数范围从 0 到 28。因此,十进制值的二进制表示形式为 ((-296 到 296) / 10(0 到 28)),其中-296-1 等于 MinValue,296-1 等于 MaxValue。

缩放因子还保留 Decimal 数字中的任何尾随零。尾随零不会影响算术或比较运算中的 Decimal 数的值。但是,如果应用了适当的格式字符串,则 ToString 方法可以显示尾随零。

于 2010-07-20T20:39:36.513 回答
0

来自 J.Richter 的“CLR via C#”第 3 版:

一种 128 位高精度浮点值,通常用于不能容忍舍入误差的财务计算。在 128 位中,1 位表示值的符号,96 位表示值本身,8 位表示 10 的幂除以 96 位值(可以是 0 到 28 之间的任何值)。其余位未使用。

于 2010-07-20T20:39:18.997 回答
0

decimal 关键字表示 128 位数据类型。

来源

Decimal 值的二进制表示由 1 位符号、96 位整数和用于划分 96 位整数并指定它的哪一部分是小数部分的比例因子组成。比例因子是隐含的数字 10,指数范围从 0 到 28。因此,十进制值的二进制表示形式为 ((-296 到 296) / 10(0 到 28)),其中-296-1 等于 MinValue,296-1 等于 MaxValue。

来源

于 2010-07-20T20:39:47.823 回答
0

十进制类型只是浮点数的另一种形式 - 但与浮点数和双精度数不同,使用的基数是 10。

一个简单的解释在这里http://csharpindepth.com/Articles/General/Decimal.aspx

于 2010-07-20T20:49:40.670 回答