是"十进制"输入C#binary-coded-decimal?

时间:2014-04-15 17:31:54

标签: c# floating-point numbers decimal

我想使用C#处理十进制货币(EUR)的价格,而不用担心舍入错误而不用我自己的方式进行十进制算术。 The C# reference for the decimal type

  

与浮点类型相比,十进制类型具有更高的精度和更小的范围,这使其适用于财务和货币计算。

什么?

我不会对精确度有所了解,我只想要七个sig-figs。但我想知道5.31 EUR是一个确切的值。 A,二进制编码的十进制类型是理想的。所以我的问题是C#decimal是否是那种类型。

1 个答案:

答案 0 :(得分:12)

不,它不是BCD(每个数字按特定位数单独编码) - 但你想要它。 (我当然从未声称它是。)

decimal是一个浮点类型,因为它有一个有效数和一个指数,两个整数 - 它与floatdouble不同,“点”被转移了指数是小数点而不是二进制点。不幸的是MSDN说“与浮点类型相比”,它的确意味着“与二进制浮点类型相比”。

decimal documentation确实让它变得相当清楚:

  

十进制数是一个浮点值,由一个符号,一个数值组成,其中值中的每个数字的范围为0到9,以及一个缩放因子,指示分隔积分的浮点小数点的位置和数值的小数部分。

     

十进制值的二进制表示由1位符号,96位整数和用于除以96位整数的比例因子组成,并指定它的小数部分。缩放因子隐式为数字10,上升到指数范围从0到28.因此,十进制值的二进制表示形式为((-2 96 至2 96 < / sup>)/ 10 (0到28)),其中 - (2 96 -1)等于MinValue,2 96 -1等于MaxValue。有关Decimal值的二进制表示的更多信息和示例,请参阅Decimal(Int32 [])构造函数和GetBits方法。