20

.NET 类型如何decimal在内存中以二进制形式表示?

我们都知道浮点数是如何存储的,因此也知道其不准确的原因,但decimal除了以下内容,我找不到任何信息:

  1. 显然比浮点数更准确
  2. 占用 128 位内存
  3. 2^96 + 符号范围
  4. 28(有时是 29?)总数中的有效数字

有什么办法可以解决这个问题吗?我内心的计算机科学家要求答案,经过一个小时的尝试研究,我找不到答案。似乎要么有很多浪费的位,要么我只是在脑海中想象这个错误。任何人都可以对此有所了解吗?

4

2 回答 2

39

Decimal.GetBits获取您想要的信息。

基本上它是一个 96 位整数作为尾数,加上一个符号位,再加上一个指数来表示将其向右移动多少小数位。

因此,要表示 3.261,您的尾数为 3261,符号位为 0(即正数),指数为 3。请注意,十进制未标准化(故意),因此您也可以通过使用尾数来表示 3.2610例如,32610 和 4 的指数。

我在关于十进制浮点数的文章中有更多信息。

于 2010-09-27T06:08:51.473 回答
1

https://www.cshapindepth.com/Articles/Decimal

小数如何存储?

十进制以 128 位存储,尽管只有 102 位是绝对必要的。很方便将小数视为三个 32 位整数表示尾数,然后一个整数表示符号和指数。最后一个整数的最高位是符号位(以正常方式,该位被设置为 (1) 用于负数)和位 16-23(高 16 位字的低位)包含指数。其他位必须全部清零 (0)。这个表示是由它给出的,decimal.GetBits(decimal)它返回一个 4 个整数的数组。

于 2019-06-22T10:22:08.423 回答