我想使用C#处理十进制货币(EUR)的价格,而不用担心舍入错误而不用我自己的方式进行十进制算术。 The C# reference for the decimal
type说
与浮点类型相比,十进制类型具有更高的精度和更小的范围,这使其适用于财务和货币计算。
什么?
我不会对精确度有所了解,我只想要七个sig-figs。但我想知道5.31 EUR
是一个确切的值。 A,二进制编码的十进制类型是理想的。所以我的问题是C#decimal
是否是那种类型。
答案 0 :(得分:12)
不,它不是BCD(每个数字按特定位数单独编码) - 但你想要它。 (我当然从未声称它是。)
decimal
是一个浮点类型,因为它有一个有效数和一个指数,两个整数 - 它与float
和double
不同,“点”被转移了指数是小数点而不是二进制点。不幸的是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方法。