CSharp - 当一个十进制类型使用double , 而我什么时候应该使用?

  显示原文与译文双语对照的内容

这个问题已经有了如下答案:

我一直看到人们在 C# 中使用替身。 我知道我阅读的地方有时候会丢失精度。 我的问题是什么时候应该使用 double,什么时候应该使用十进制类型? 哪一种类型适合于货币计算? ( IE,大于 $100百万)

时间:

我的问题是什么时候应该使用 double,什么时候应该使用十进制类型?

在转化 10表示- 基本上 money, decimal 10 ^ ( +/-28 ) 除非当你使用该区域中的值,以及在什么地方有关于实下面based.的预期

用于当你需要 double 相对精度( 例如 。 在较大的数值上丢失尾随数字的精度不是问题( 在不同的数量级下) - double 覆盖超过 10 ^ ( +/-300 ) 。 科学计算是这里最好的例子。

哪一种类型适合于货币计算?

十进制,十进制,十进制

接受无替代项。

最重要的因素是,作为二进制分数实现的double 不能精确地表示所有的decimal 分数( 像 0.1 ) ,因为它是 64位 宽 vs,因为它是宽 128位,用于 decimal 。 最后,金融应用程序经常必须遵循特定的舍入模式 ( 有时被法律所约束) 。 decimal支持这些double 不支持。

System.Single/浮动 - 7数字
System.Double/双- 15 -16位
System.Decimal/十进制- 28 -29有效数字

使用错误类型( 好几年前)的方式是:

你在 1百万的地方跑了一个花车。

一个 15位货币值:

9 兆随以一个双精度。 但有了除法和比较,更复杂的( 我绝对不擅长浮点和无理数字- 参见 marc的点) 。 混合小数和双打会导致问题:

使用floating-point数字的数学或者比较操作可能不会产生相同的结果,如果使用的是十进制数字,因为floating-point数字可能与十进制数字不完全相同。

when应该用双倍而不是十进制? 具有一些相似和更深入的答案。

使用 double 代替 decimal 用于货币应用程序是一个 micro-optimization - 这是最简单的方法。

于你的钱相关 computations, 肯定是使用整数 types. 这是不够强调的,因为乍看起来,似乎是一个浮点类型。

下面是 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

...