为什么.NET不定义较小的Decimal类型?

时间:2012-03-22 16:23:05

标签: .net floating-point

所以我(我想)理解Float, Double, and Decimal之间的区别,但我想知道的一件事是为什么有两个大小的浮动二进制点,但只有一个浮动小数点大小?

如果我理解正确的一般原则,如果你不需要额外的大小,你想在32位处理器上使用浮点数(32位)来实现双倍(64位)的性能双重的。在64位处理器上,double应该更高性能,因此这个原理并不是必需的。但Decimal类型是128位。那么为什么不提供64位十进制,甚至是32位?

只是用例问题;没有人真的需要它吗?或者是否存在技术原因,例如您无法准确呈现小于128位的有用小数范围?

3 个答案:

答案 0 :(得分:4)

与Eric Lippert的Features start off as unimplemented and only become implemented when people spend effort implementing them的强制性链接。

为什么这不是个好主意:

  • 任何其他数字类型都需要从/到其他数字类型的大量转换,以及允许哪些转换以及哪些不允许转换的规则。
  • 较小的类型(特别是32位)根本没有有用的范围 - 即项目的合理价格范围至少为8位数12345.67(最低货币单位的十分之一)。

答案 1 :(得分:1)

较小的十进制类型的能力较差。由于您不倾向于执行浮点数据常见的相同类型的高容量计算,因此似乎不需要基于性能的较小小数。

答案 2 :(得分:1)

  

为什么有两种大小的浮点二进制点

因为许多编程语言已经有单独的单精度和双精度浮点类型,包括C(++),Java和Visual Basic。很自然地,C ++ / CLI,J#和VB.NET也会有这些类型。

OTOH,没有向后兼容性的原因有多个十进制浮点类型。

  

如果我理解正确的一般原则,你会想要使用   浮点(32位),性能超过32位的双倍(64位)   处理器,如果你不需要额外的双倍大小。

没有。尽管它的名称,double长期以来一直是“主要”浮点类型,float是用于内存优化的“半精度”类型。例如,.NET System.Math类几乎总是使用double而不是float。在所有C语言中,像1.23这样的文字都有double类型(你需要一个额外的f来获得一个浮点数。)

  

那么为什么不提供64位十进制,甚至是32位?

使用32位(可能是7位数)decimal时,您会一直遇到舍入错误。现在,在某些情况下,为了提高效率,您可能会故意牺牲精度,但在这种情况下,您也可以使用float来获得硬件支持的好处。