我经常看到有人在c#中使用双精度对象。我知道我在什么地方读到过,double有时会失去精度。 我的问题是,什么时候应该使用双精度型,什么时候应该使用十进制类型? 哪种类型适合货币计算?(即。超过1亿美元)


当前回答

根据浮点类型的特征:

.NET Type C# Keyword Precision
System.Single float ~6-9 digits
System.Double double ~15-17 digits
System.Decimal decimal 28-29 digits

几年前,我就曾因使用错误的类型而受到伤害:

520,532.52英镑- 8位数 1323,523.12英镑- 9位数

你花了一百万买了一辆车。

15位数的货币价值:

£1234567890123 .45

9万亿。但是对于除法和比较,这就更加复杂了(我绝对不是浮点数和无理数方面的专家——参见Marc的观点)。将小数和双精度数混合会导致以下问题:

比较运算:数学或比较运算 它使用浮点数 可能不会产生相同的结果,如果 使用十进制数是因为 浮点数可能不会 小数点完全近似 号码。

什么时候我应该用double代替decimal?有一些类似的和更深入的答案。

在货币应用中使用双位数而不是十进制是一种微观优化——这是我看待它的最简单的方式。

其他回答

我认为除了位宽之外的主要区别是十进制的指数以10为底,而double的指数为2

http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html

一定要使用整数类型进行金钱计算。 这一点再怎么强调也不为过,因为乍一看,浮点类型就足够了。

下面是python代码中的一个例子:

>>> amount = float(100.00) # one hundred dollars
>>> print amount
100.0
>>> new_amount = amount + 1
>>> print new_amount
101.0
>>> print new_amount - amount
>>> 1.0

看起来很正常。

现在再试试10^20津巴布韦元:

>>> amount = float(1e20)
>>> print amount
1e+20
>>> new_amount = amount + 1
>>> print new_amount
1e+20
>>> print new_amount-amount
0.0

如你所见,美元消失了。

如果你使用整数类型,它工作得很好:

>>> amount = int(1e20)
>>> print amount
100000000000000000000
>>> new_amount = amount + 1
>>> print new_amount
100000000000000000001
>>> print new_amount - amount
1

对于钱,总是小数。这就是它被创建的原因。

如果数字必须正确相加或平衡,请使用十进制。这包括任何财务存储或计算、分数或其他人们可能手工完成的数字。

如果数字的确切值不重要,可以使用double来加快速度。这包括图形学、物理学或其他物理科学计算,其中已经有“有效数字的数量”。

根据浮点类型的特征:

.NET Type C# Keyword Precision
System.Single float ~6-9 digits
System.Double double ~15-17 digits
System.Decimal decimal 28-29 digits

几年前,我就曾因使用错误的类型而受到伤害:

520,532.52英镑- 8位数 1323,523.12英镑- 9位数

你花了一百万买了一辆车。

15位数的货币价值:

£1234567890123 .45

9万亿。但是对于除法和比较,这就更加复杂了(我绝对不是浮点数和无理数方面的专家——参见Marc的观点)。将小数和双精度数混合会导致以下问题:

比较运算:数学或比较运算 它使用浮点数 可能不会产生相同的结果,如果 使用十进制数是因为 浮点数可能不会 小数点完全近似 号码。

什么时候我应该用double代替decimal?有一些类似的和更深入的答案。

在货币应用中使用双位数而不是十进制是一种微观优化——这是我看待它的最简单的方式。

对于钱:十进制。它消耗更多的内存,但不像double有时会有舍入问题。