.NET - 为什么C#中没有定点数值数据类型?

ric*_*ard 7 .net c# fixed-point

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

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

SLa*_*aks 8

你正在寻找这个鲜为人知的System.Data.SqlTypes.SqlDecimal课程.

  • @SLaks请编辑您的原始答案不要发布多个答案. (4认同)
  • @JonH:正如鲁本所说,这不是一个纯粹的答案.SqlDecimal是专门为SQL设计的; 对于一般用途,"十进制"**被认为是足够好的.我的两个答案与彼此无关. (2认同)

SLa*_*aks 6

Decimal (基数为10的浮点数)被认为足够好了.

  • 我不明白那个答案。他要求定点,而您想出了另一种浮点类型? (4认同)
  • 所以我认为这对于80%的案例来说已经足够好了,他们把20%的情况留给我们来创造我们自己的结构?似乎至少包含一个固定点类型! (2认同)
  • @SQLPolice:不;他问_为什么_BCL没有。 (2认同)

Rub*_*ben 6

一个问题可能与这个问题有关:你在哪里解决问题?.NET中的类型不能通过除类型之外的其他参数进行参数化,因此FixedNum<18,6>根本不可能.而你不希望创建FixedNum1x0,FixedNum1x1,FixedNum2x0,FixedNum2x1,FixedNum2x2,等.

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

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

FixedNum x = new FixedNum(1, decimals: 0);
...
x = f(); // precision of x increased.
Run Code Online (Sandbox Code Playgroud)

因此,每次从不是局部变量的东西中获取它们时,您需要检查并约束固定点值.就像你decimal想要一个固定的比例或精度一样.

换句话说,鉴于.NET类型系统的局限性,decimal已经内置了FixedNum类的实现.

  • 同意,除了`decimal`不是FixedNum实现,它是一个浮点类型 - 只有它是基数10而不是基数2. (3认同)