【问题标题】:Binary representation of a .NET Decimal.NET 十进制的二进制表示
【发布时间】:2011-04-17 14:49:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: .net binary decimal representation


    【解决方案1】:

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

    小数如何存储?

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

    【讨论】:

      【解决方案2】:

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

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

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

      我在decimal floating point 的文章中有更多信息。

      【讨论】:

      • +1 绝妙的答案,切中要害,信息丰富。
      • @Jacob:不,这显然不是真的。鉴于您可以从整数开始并以(例如)0.1 结束,这显然是向右移动。如果您可以向左移动,您将能够表示 10、100 等 - 但不能表示 0.1、0.01 等。将来,请在更改答案之前等待“确认”大意是这样的。请参阅decimal 的文档:msdn.microsoft.com/en-us/library/1k2e8atx.aspx - 其中缩放因子被称为整数,相当于将其向右移动。
      • 我很抱歉。对我来说,将其视为将 小数点 移动到 left 更直观,但我现在看到您指的是“移动”尾数。跨度>
      • 从书中:«bits 16-23(高 16 位字的低位)包含指数»——这是否意味着指数有 8 位,因此可以移位最多 255 位小数?
      • @nalply:8 位实际上是为指数保留的,但它有一个限制,因此范围实际上只有 0-29。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 2014-10-30
      • 2013-11-07
      • 1970-01-01
      相关资源
      最近更新 更多