关于C#:十进制与双精度!-我应该用哪一个?什么时候用?

decimal vs double! - Which one should I use and when?

本问题已经有最佳答案,请猛点这里访问。

我经常看到人们在C中使用双打。我知道我在某个地方读到双打有时会失准。我的问题是A何时应该使用double,何时应该使用decimal类型?哪种类型适合于货币计算?(即超过1亿美元)


为了钱,总是小数。这就是它被创造的原因。

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

如果数字的精确值不重要,请使用double表示速度。这包括图形、物理或其他物理科学计算,其中已经有"有效数字数"。


My question is when should a use a
double and when should I use a decimal
type?

decimal,用于处理10^(+/-28)范围内的值以及基于10个表示(基本上是金钱)对行为有预期的情况。

double用于当您需要相对精度(即大值尾随数字的精度降低不是问题)时,跨越非常不同的大小-double覆盖超过10^(+/-300)。科学计算是最好的例子。

which type is suitable for money
computations?

十进制、十进制、十进制

不接受替代品。

最重要的因素是,double作为一个二进制分数来实现,根本无法准确地表示许多decimal分数(如0.1),而且由于它是64位宽的,而decimal是128位宽的,所以它的总位数较小。最后,金融应用程序通常必须遵循特定的四舍五入模式(有时由法律强制)。decimal支持这些;double不支持。


系统.单/浮点数-7位系统。双/双-15-16位数字十进制/十进制-28-29位有效数字

我被错误的类型所刺痛(几年前)的方式是大量使用:

  • 520532.52英镑-8位数
  • 1323523.12英镑-9位数

你花了100万换一个浮球。

15位数的货币价值:

  • 1234567890123.45英镑

9万亿,加倍。但是对于除法和比较法来说,它更复杂(我绝对不是浮点和无理数方面的专家——见马克的观点)。小数和双精度混合会导致问题:

A mathematical or comparison operation
that uses a floating-point number
might not yield the same result if a
decimal number is used because the
floating-point number might not
exactly approximate the decimal
number.

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

在货币应用中使用double而不是decimal,是一种微观优化——这是我看待它的最简单方式。


小数表示精确值。double表示近似值。

1
2
3
USD: $12,345.67 USD (Decimal)
CAD: $13,617.27 (Decimal)
Exchange Rate: 1.102932 (Double)


为了钱:decimal。它需要更多的内存,但有时不会像double那样出现舍入问题。


一定要用整数类型来计算你的钱。这一点还不够强调,因为乍一看,浮点类型似乎是足够的。

下面是Python代码中的一个示例:

1
2
3
4
5
6
7
8
>>> 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津巴布韦元再试试这个

1
2
3
4
5
6
7
8
>>> amount = float(1e20)
>>> print amount
1e+20
>>> new_amount = amount + 1
>>> print new_amount
1e+20
>>> print new_amount-amount
0.0

如你所见,美元消失了。

如果使用integer类型,则可以正常工作:

1
2
3
4
5
6
7
8
>>> amount = int(1e20)
>>> print amount
100000000000000000000
>>> new_amount = amount + 1
>>> print new_amount
100000000000000000001
>>> print new_amount - amount
1


我认为位宽度旁边的主要区别是十进制以10为底,double以2为底

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