vb / c#十进制内部格式

VB或C#中“十进制”值的内部格式是什么?

我不知道这对我正在做的任何事都很重要,但这是很有趣的事情之一。 比如,知道有多少位以及负数如何存储可能意味着当你看到一个负数出现在你预期的正面时,你可以立刻想到,“啊,有一个溢出”而不是被深深的黑暗奥秘困惑。

您的问题的答案由文档提供完整的技术说明 :

十进制值类型表示十进制数,范围从正数79,228,162,514,264,337,593,543,950,335到负数79,228,162,514,264,337,593,543,950,335。 Decimal值类型适用于需要大量有效积分和小数位且没有舍入误差的财务计算。 Decimal类型不会消除舍入的需要。 相反,它最大限度地减少了因舍入而导致的错误。

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

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

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

和二进制表示,如GetBits的文档中GetBits

十进制数的二进制表示由1位符号,96位整数和用于除以整数的比例因子组成,并指定它的哪个部分是小数。 缩放因子隐含地为数字10,增加到范围从0到28的指数。

返回值是32位有符号整数的四元素数组。

返回数组的第一,第二和第三个元素包含96位整数的低,中,高32位。

返回数组的第四个元素包含比例因子和符号。 它由以下部分组成:

低位字0到15位未使用,必须为零。

位16到23必须包含0到28之间的指数,表示除以整数的10的幂。

第24至30位未使用,必须为零。

位31包含符号:0表示正数,1表示负数。

注意,位表示区分负零和正零。 在所有操作中,这些值被视为相等。

c#和VB.NET decimalSystem.Decimal ,它有很好的文档: System.Decimal

十进制(C#参考)

decimal关键字表示128位数据类型。 与浮点类型相比,十进制类型具有更高的精度和更小的范围,这使其适用于财务和货币计算。 十进制类型的近似范围和精度如下表所示。

范围:±1.0×10-28至±7.9×1028精度:28-29位有效数字

十进制数据类型(Visual Basic)

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