VB或C#中“十进制”值的内部格式是什么?
我不知道这对我正在做的任何事情都很重要,但这是很好的事情之一。比如,知道多少位和负数如何存储可能意味着当你看到一个负数出现在你预期的正面时,你可以立刻想到,“啊,有一个溢出”,而不是被深深的黑暗奥秘困惑
答案 0 :(得分:8)
问题的答案由documentation提供完整的技术色彩:
十进制值类型表示范围从的十进制数 为负数为79,228,162,514,264,337,593,543,950,335 79,228,162,514,264,337,593,543,950,335。 Decimal值类型是 适用于需要大量资金的财务计算 显着的积分和小数位数,没有舍入误差。 Decimal类型不会消除舍入的需要。相反,它 最大限度地减少因四舍五入造成的错误。
十进制数是一个由符号a组成的浮点值 数值,其中值中的每个数字范围从0到9,以及a 缩放因子,指示浮动小数点的位置 用于分隔数值的整数部分和小数部分。
十进制值的二进制表示由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。
返回值是一个由32位有符号整数组成的四元素数组。
返回数组的第一个,第二个和第三个元素包含 96位整数的低,中,高32位。
返回数组的第四个元素包含比例因子和 标志。它由以下部分组成:
0到15位,低位字未使用,必须为零。
第16位至第23位必须包含0到28之间的指数 表示10的幂除以整数。
第24至30位未使用且必须为零。
位31包含符号:0表示正数,1表示负数。
请注意,位表示区分负数和 正零。这些值被视为完全相同 操作
答案 1 :(得分:1)
c#和VB.NET decimal
都引用System.Decimal
,其中有详细记录:System.Decimal
decimal关键字表示128位数据类型。相比 浮点类型,十进制类型具有更高的精度和a 较小的范围,这使其适用于金融和货币 计算。十进制类型的近似范围和精度 如下表所示。
范围:±1.0×10-28至±7.9×1028 精度:28-29位有效数字
Decimal Data Type (Visual Basic)
保持有符号的128位(16字节)值,表示96位(12字节) 由10的可变幂缩放的整数。缩放因子 指定小数点右边的位数;它 范围从0到28.如果比例为0(无小数位),则为 最大可能值为+/- 79,228,162,514,264,337,593,543,950,335 (+/- 7.9228162514264337593543950335E + 28)。有小数点后28位, 最大值为+/- 7.9228162514264337593543950335,最小值 非零值为+/- 0.0000000000000000000000000001(+/- 1E-28)。