【问题标题】:.NET - Why is there no fixed point numeric data type in C#?.NET - 为什么 C# 中没有定点数值数据类型?
【发布时间】:2011-02-21 18:29:12
【问题描述】:

看起来定点数据类型会有很多用途。为什么 .NET 中没有?

注意:我知道我们可以创建自己的类/结构来满足我们的定点目的和需求。那不是我的问题。我想知道为什么 MS 决定不包含定点数值数据类型。

【问题讨论】:

标签: c# .net fixed-point


【解决方案1】:

您正在寻找鲜为人知的System.Data.SqlTypes.SqlDecimal class

【讨论】:

  • @SLaks 请编辑您的原始答案,不要发布多个答案。
  • 不太清楚为什么 SqlDecimal 比 Decimal 更好。 IIRC,它在算术运算期间不保留比例或精度。它只允许您明确调整它的比例。但 Decimal.Round 也是如此。
  • @Ruben:SqlDecimal 是定点的;十进制是浮点数。不过,我从未使用过它(Sql)。
  • @SLaks:SQL的小数(p,s)是定点; .NET 的 SqlDecimal 是浮点数:您可以将具有 any 比例的数字分配给 SqlDecimal(当然在限制范围内)。此外,SqlDecimal 上的算术运算不保证保留比例。根据定义,这意味着 SqlDecimal 是浮点类型。 SqlDecimal 仅存储刻度以供参考和舍入针对特定实例
  • @JonH:正如鲁本所说,这不是一个纯粹的答案。 SqlDecimal 是专门为 SQL 设计的;对于一般用途,Decimal 被认为足够好。我的两个答案彼此无关。
【解决方案2】:

Decimal(base-10 浮点数)被认为足够好。

【讨论】:

  • 所以我想这对于 80% 的情况来说已经足够好了,而他们把 20% 留给我们来创建我们自己的结构?似乎至少会包含一种定点类型!
  • 我不明白那个答案。他要求定点,你想出另一种浮点类型?
  • @SQLPolice:否;他问为什么 BCL 没有。
【解决方案3】:

一个问题可能与这个问题有关:你在哪里解决问题? .NET 中的类型不能由类型以外的其他参数参数化,因此 FixedNum<18,6> 根本不可能。而你不想创建FixedNum1x0FixedNum1x1FixedNum2x0FixedNum2x1FixedNum2x2等。

您需要能够参数化您的定点类型,而不仅仅是值,因为这将导致几乎无法跟踪错误:

FixedNum f() { return new FixedNum(1, decimals: 2); }

FixedNum x = new FixedNum(1, decimals: 0);
...
x = f(); // precision of x increased.

因此,每次从非局部变量中获取定点值时,您都需要检查和约束它们。当您需要固定的比例或精度时,就像使用 decimal 一样。

换句话说,鉴于 .NET 类型系统的限制,decimal 已经是上述 FixedNum 类的内置实现。

【讨论】:

  • 同意,除了 decimal 不是 FixedNum 实现,它是浮点类型 - 只是它是基数 10 而不是基数 2。
  • @chiccodoro:最后一段中的 FixedNum 类特指我在反例中的虚构类型。您说得对,十进制是浮点类型,但我的示例中的 FixedNum 也是如此。
猜你喜欢
  • 2013-10-20
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 2010-11-03
  • 2015-03-18
  • 1970-01-01
相关资源
最近更新 更多