C#
中的double
类型对于我的需求来说不够精确。我正在编写一个分形程序,当我缩放几次后,就会失去精度。
是否有一种数据类型可以保存比double
更多精确的浮点信息(即更多的小数位数)?
是的,decimal
就是为此而设计的。
然而,请注意,decimal类型的范围比double小。double可以容纳更大的值,但会失去精度。或者,如MSDN所述:
decimal关键字表示一个128位数据类型。 与浮点类型相比,decimal类型具有更高的精度和更小的范围, 这使其适用于金融和货币计算。下表显示了decimal类型的近似范围和精度。
decimal
和double
之间的主要区别在于decimal
是定点数,而double
是浮点数。这意味着decimal存储精确值,而double
表示由分数表示的值,并且不太精确。decimal
是128位的,因此需要双倍的空间来存储。在decimal
上的计算也较慢(请注意!)。
如果您需要更大的精度,则可以从.NET 4中使用BigInteger
。(您将需要自己处理小数点)。在这里,您应该注意,BigInteger是不可变的,因此对其进行任何算术运算将创建一个新实例-如果数字很大,这可能会影响性能。
我建议您确切地了解需要多么精确。也许您的算法可以使用规范化值,这些值可以更小?如果性能是一个问题,内置的浮点类型中的一种可能会更快。
Decimal
是一种浮点类型,尽管其动态范围小于float
。我觉得这个设计很奇怪,因为该类型占用16个字节,而一个带有68位整数部分和60位小数部分的类型几乎可以更高效地完成Decimal
所做的一切。在高端没有那么多范围,在低端没有那么精确,但能够保证加法和减法要么完全精确执行,要么完全失败--这是double
无法提供的保证。 - supercatDecimal
更高的精度,请查看BigInteger(.NET 4)。BigInteger
(类似于 int
)只能存储整数。 - Adam Robinson