【问题标题】:Is the "decimal" type in C# binary-coded-decimal?C# binary-coded-decimal 中的“十进制”类型是什么?
【发布时间】:2014-05-30 05:08:59
【问题描述】:

我想使用 C# 以十进制货币 (EUR) 处理价格,而不用担心舍入错误,也不需要滚动我自己的十进制算术方法。 The C# reference for the decimal type

与浮点类型相比,十进制类型的精度更高,范围更小,适用于金融和货币计算。

什么?

我不在乎精确度,我只想要大约七个 sig-figs。但我想知道5.31 EUR 是一个精确值。 A,二进制编码的十进制类型将是理想的。所以我的问题是 C# decimal 是否是那种类型。

【问题讨论】:

  • 不要纠结于“精度”之类的术语。 decimal 专为金钱计算而设计;如果您使用其他任何东西,您将进入一个受伤的世界。
  • 这根本无法回答问题。如果decimal 实际上在后台使用小数,那么它可以工作。但是我仔细看过的所有文档都避免这样说。
  • 实现无关。了解它的工作原理是相关的,并进行了足够详细的描述:它可以很好地供您使用。
  • @TimS。实现很重要,因为它只有在内部表示为基数 10 时才可能起作用。在我看到 Jon 的回答之前,我在文档中找不到任何可以准确存储“0.1”的内容。
  • 尽量让你的问题保持干净;每个人都可以在下面看到 Jon 的答案,他们也可以看到您接受了它作为正确的答案。他们还可以看到所有的 cmets。

标签: c# floating-point numbers decimal


【解决方案1】:

不,它不是BCD(每个数字都单独编码为特定位数)- 但您不希望这样。 (而且我当然从未声称它是。)

decimal 是浮点类型,因为它有一个有效数和一个指数,都是整数 - 只是与 floatdouble 不同,被指数移动的“点”是小数点而不是二进制点。不幸的是,MSDN 说的是“与浮点类型相比”,而它真正的意思是“与二进制浮点类型相比”。

decimal documentation 确实说明了这一点:

十进制数是一个浮点值,它包含一个符号、一个数值,其中每个数字的范围从 0 到 9,以及一个比例因子,该比例因子表示分隔整数的浮点小数点的位置和数值的小数部分。

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

【讨论】:

  • 那不还是BCD吗?它不是定点的,它只是编码为位的十进制科学记数法。
  • @AdrianRatnapala:不,这不是 BCD。点击链接查看 BCD 的实际含义。
  • 之所以可行,是因为任何十进制整数都可以精确地以二为底表示,但比例因子是以 10 为底?
  • 我明白了。指数是十进制的,但尾数是二进制的补码。这显然是正确的做事方式。
  • 我正要这么说,但我不确定。 :)
猜你喜欢
  • 2020-10-31
  • 2021-02-10
  • 1970-01-01
  • 2017-04-11
  • 2011-03-18
  • 2011-07-17
  • 2011-11-21
  • 1970-01-01
  • 2010-10-16
相关资源
最近更新 更多