5

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

我不知道这对我立即做的任何事情都很重要,但这是很高兴知道的事情之一。就像,知道有多少位以及如何存储负数可能意味着当你看到一个负数出现在你期望一个正数的地方时,你可以立即想,“啊,有一个溢出”,而不是被深深的黑暗谜团所迷惑.

4

2 回答 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 以及一个比例因子组成,该比例因子表示分隔整数和小数部分的浮点小数点的位置的数值。

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

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

以及二进制表示,如文档中所述GetBits

Decimal 数的二进制表示由一个 1 位符号、一个 96 位整数和一个比例因子组成,该比例因子用于划分整数并指定它的哪一部分是小数部分。比例因子隐含地是数字 10,升为从 0 到 28 的指数。

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

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

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

位 0 到 15(低位字)未使用且必须为零。

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

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

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

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

于 2013-03-11T21:26:52.713 回答
2

c# 和 VB.NET 都decimal引用了System.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)。

于 2013-03-11T21:27:16.693 回答