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

时间:2010-07-20 20:35:14

标签: c# types decimal primitive

如何实施decimal类型?

更新

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

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

6 个答案:

答案 0 :(得分:8)

维基百科上的

Decimal Floating Point文章,其中包含有关System.Decimal的本文的特定链接。

  

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

答案 1 :(得分:1)

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

  

十进制的二进制表示   值由1位符号组成   96位整数,以及缩放   用于分割96位的因子   整数并指定它的哪个部分   是小数部分。缩放   因素是隐含的数字10,   提升到0的指数   到28.因此,二进制   十进制值的表示是   形式,(( - 296至296)/ 10(0至   28)),其中-296-1等于   MinValue和296-1相等   MaxValue的。

     

比例因子也保留了任何   以十进制数表示尾随零。   尾随零不会影响   一个十进制数的值   算术或比较操作。   但是,尾随零可以   如果一个ToString方法透露   应用适当的格式字符串。

答案 2 :(得分:1)

来自C# Language Specifications

  

decimal类型是128位数据类型,适用于财务和货币计算   decimal类型可以表示从1.0×10 -28 到大约7.9×10 28 的值,28-29个有效数字。

     

decimal类型的有限值的形式为(-1) s × c ×10 < sup> - e ,其中符号 s 为0或1,系数 c 由0≤给出c &lt; 2 96 ,比例 e 是0≤ e ≤28。   decimal类型不支持带符号的零,无穷大或NaN。 decimal表示为以10的幂为单位缩放的96位整数。对于绝对值小于1.0m的小数,该值精确到28 th 小数位,但不再进一步。

     

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

     

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

     

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

     

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

     

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

答案 3 :(得分:0)

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

  

128位高精度   常用的浮点值   财务计算   舍弃错误是不能容忍的。的   128位,1位代表   值的符号,96位代表   值本身,8位表示   10的幂来划分96位   value by(可以是0到   28)。其余的位未使用。

答案 4 :(得分:0)

  

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

Source

  

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

Source

答案 5 :(得分:0)

  

十进制类型只是另一种形式   浮点数 - 但不像   float和double,使用的基数是10.

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