VB/C# 十进制内部格式

5

"decimal"值在VB或C#中的内部格式是什么?

我不知道这是否和我目前正在做的任何事情有关,但这是那些需要了解的东西之一。例如,了解存储多少位和如何存储负数可以意味着当你看到负数出现在你期望的正数位置时,你可以立即想到,“啊,这里发生了溢出”,而不是被深深的神秘所困扰。


1
请参考以下编程相关内容:https://dev59.com/uXRB5IYBdhLWcg3wc280 或者更好的 http://csharpindepth.com/Articles/General/Decimal.aspx - Tim Schmelter
2个回答

9
你的问题的答案在文档中以全彩色提供:

Decimal值类型表示范围从正79,228,162,514,264,337,593,543,950,335到负   79,228,162,514,264,337,593,543,950,335的十进制数。 Decimal值类型是   适用于需要大量有效整数和小数位且不进行四舍五入误差的金融计算。   Decimal类型不消除舍入的需求。相反,它   减少由于舍入而引起的错误。

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

十进制值的二进制表示形式由1位符号、96位整数和一个缩放因子组成,   96位整数和用于指定其一部分为十进制分数的缩放因子。   缩放因子隐含地为数字10,被提高到指数范围从0到28。因此,十进制值的二进制表示形式为((2 96 至2 96 ) / 10 (0到28)),其中   -2 96 -1等于MinValue,2 96 -1等于MaxValue。有关十进制值的二进制表示形式和示例的详细信息,请参见Decimal(Int32 [])构造函数和GetBits方法。

缩放因子还保留十进制数字中的任何尾随零。尾随零不影响十进制数的值。   算术或比较操作。但是,如果应用适当的格式字符串,则可以由ToString方法显示尾随零。

GetBits文档中描述了其二进制表示形式:
一个十进制数的二进制表示由一个1位符号、一个96位的整数和一个用于除以整数并指定其中哪部分是小数分数的缩放因子组成。缩放因子隐式地是数字10,它的指数范围从0到28。
返回值是一个由4个32位有符号整数组成的数组。
返回数组的第一、第二和第三个元素包含96位整数的低、中和高32位。
返回数组的第四个元素包含比例因子和符号。它由以下部分组成:
位0至15(低字)未使用,必须为零。
位16至23必须包含介于0和28之间的指数,该指数表示将整数除以10的幂。
位24至30未使用,必须为零。
位31包含符号:0表示正,1表示负。
请注意,位表示区分负零和正零。在所有操作中,这些值被视为相等。

谢谢。我没有想到要在System.decimal下查找,我一直在查看标准数据类型的列表,它们谈论了范围但没有提到格式。好吧,也许那应该是一个显而易见的地方,我脑子一片空白。 - Jay

2
无论是C#还是VB.NET,decimal都指的是System.Decimal类型,该类型有详细的文档:System.Decimaldecimal (C# Reference)

decimal关键字表示128位数据类型。与浮点类型相比,decimal类型具有更高的精度和更小的范围,因此非常适用于财务和货币计算。下表显示了decimal类型的近似范围和精度。

范围:±1.0 × 10−28 to ±7.9 × 1028 精度:28-29个有效数字

Decimal Data Type (Visual Basic)

保存带有可变10的幂次方缩放因子的12字节整数数字,表示带符号的128位(16字节)值。缩放因子指定小数点右侧的数字位数;它的范围从0到28。当缩放因子为0(没有小数位)时,最大可能值为+/-79,228,162,514,264,337,593,543,950,335(+/-7.9228162514264337593543950335E+28)。当缩放因子为28时,最大值为+/-7.9228162514264337593543950335,最小非零值为+/-0.0000000000000000000000000001(+/-1E-28)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接