C#有一个数值类型具有128位精度(参见表2-3)。它适合大而精确的计算,尤其是金融计算。
表2-3 decimal类型
类型 | 大小 | 范围 | BCL名称 | 有效数字 |
decimal | 128位 | 1.0×1028~大约7.9×1028 | System.Decimal | 28~29 |
与浮点数不同,decimal类型保证范围内的所有十进制数都是精确的。所以,对于decimal类型来说,0.1就是0.1,而不是一个近似值。不过,虽然decimal类型具有比浮点类型更高的精度,但它的范围较小。所以,从浮点类型转换为decimal类型可能发生溢出错误。此外,decimal的计算速度要稍微慢一些。
高级主题:解析浮点类型和decimal类型
除非超过范围,否则decimal数字表示的十进制数都是完全准确的。与此相反,用浮点数来表示十进制数,则可能造成舍入错误。decimal类型和C#的浮点类型之所以存在这个区别,是因为decimal类型的指数是十进制数,而浮点类型的指数是二进制的。
一个decimal的指数是±N×10k;其中,N是用96个比特来表示的一个正整数,而28 <= k <= 0。
而一个浮点数是±N×2k的任意数字。其中,N是用固定数量(float是24,double是53)的比特表示的一个正整数,k是149~+104(float)或者1075~+970(double)的任何整数。