如何实施decimal
类型?
更新
谢谢!我会坚持用我自己的隐含比例使用64位长。
答案 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)
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位。与
float
和double
数据类型相反,0.1等小数小数可以用十进制表示精确表示。 在float
和double
表示中,此类数字通常是无限分数,使得这些表示更容易出现舍入错误。如果二元运算符的某个操作数的类型为
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位数据类型。
十进制值的二进制表示由1位符号,96位整数和用于除以96位整数的比例因子组成,并指定它的小数部分。缩放因子隐式为数字10,上升到指数范围从0到28.因此,十进制值的二进制表示形式为(( - 296到296)/ 10(0到28)),其中-296-1等于MinValue,296-1等于MaxValue。
答案 5 :(得分:0)
十进制类型只是另一种形式 浮点数 - 但不像 float和double,使用的基数是10.
这里有一个简单的解释http://csharpindepth.com/Articles/General/Decimal.aspx