.NET 类型如何decimal
在内存中以二进制形式表示?
我们都知道浮点数是如何存储的,因此也知道其不准确的原因,但decimal
除了以下内容,我找不到任何信息:
- 显然比浮点数更准确
- 占用 128 位内存
- 2^96 + 符号范围
- 28(有时是 29?)总数中的有效数字
有什么办法可以解决这个问题吗?我内心的计算机科学家要求答案,经过一个小时的尝试研究,我找不到答案。似乎要么有很多浪费的位,要么我只是在脑海中想象这个错误。任何人都可以对此有所了解吗?
.NET 类型如何decimal
在内存中以二进制形式表示?
我们都知道浮点数是如何存储的,因此也知道其不准确的原因,但decimal
除了以下内容,我找不到任何信息:
有什么办法可以解决这个问题吗?我内心的计算机科学家要求答案,经过一个小时的尝试研究,我找不到答案。似乎要么有很多浪费的位,要么我只是在脑海中想象这个错误。任何人都可以对此有所了解吗?
Decimal.GetBits
获取您想要的信息。
基本上它是一个 96 位整数作为尾数,加上一个符号位,再加上一个指数来表示将其向右移动多少小数位。
因此,要表示 3.261,您的尾数为 3261,符号位为 0(即正数),指数为 3。请注意,十进制未标准化(故意),因此您也可以通过使用尾数来表示 3.2610例如,32610 和 4 的指数。
我在关于十进制浮点数的文章中有更多信息。
https://www.cshapindepth.com/Articles/Decimal
小数如何存储?
十进制以 128 位存储,尽管只有 102 位是绝对必要的。很方便将小数视为三个 32 位整数表示尾数,然后一个整数表示符号和指数。最后一个整数的最高位是符号位(以正常方式,该位被设置为 (1) 用于负数)和位 16-23(高 16 位字的低位)包含指数。其他位必须全部清零 (0)。这个表示是由它给出的,
decimal.GetBits(decimal)
它返回一个 4 个整数的数组。