我可以说出使用double(或float)而不是decimal的三个优点:

使用较少的内存。 更快是因为浮点数学运算是由处理器原生支持的。 可以表示更大范围的数字。

但这些优势似乎只适用于计算密集型操作,比如在建模软件中发现的那些操作。当然,当需要精度时,不应该使用双精度,例如财务计算。那么,在“正常”应用程序中选择双位数(或浮点数)而不是十进制有什么实际的原因吗?

编辑补充: 谢谢你们的回复,我从他们身上学到了很多。

还有一个问题:一些人认为双数可以更精确地表示实数。当我宣布时,我认为他们通常更准确地代表他们。但是,当执行浮点运算时,精度可能会降低(有时会显著降低),这是真的吗?


当前回答

这取决于你要它做什么。

因为浮点数和双精度数都是二进制数据类型,所以在整数四舍五入的方法上存在一些困难和错误,例如双精度数会四舍五入0.1到0.100000001490116,双精度数也会四舍五入1 / 3到0.33333334326441。简单地说,不是所有的实数在双类型中都有准确的表示

幸运的是,c#还支持所谓的十进制浮点算术,其中数字通过十进制数字系统而不是二进制系统表示。因此,十进制浮点算术在存储和处理浮点数时不会丢失精度。这使得它非常适合需要高精度的计算。

其他回答

在某些会计中,考虑使用整型代替或结合使用整型的可能性。例如,假设您操作的规则要求每个计算结果至少前移6位,最终结果将四舍五入到最接近的便士。

A calculation of 1/6th of $100 yields $16.66666666666666..., so the value carried forth in a worksheet will be $16.666667. Both double and decimal should yield that result accurately to 6 decimal places. However, we can avoid any cumulative error by carrying the result forward as an integer 16666667. Each subsequent calculation can be made with the same precision and carried forward similarly. Continuing the example, I calculate Texas sales tax on that amount (16666667 * .0825 = 1375000). Adding the two (it's a short worksheet) 1666667 + 1375000 = 18041667. Moving the decimal point back in gives us 18.041667, or $18.04.

虽然这个简短的示例不会产生使用双位数或小数的累积错误,但可以很容易地展示简单地计算双位数或小数并继续计算会累积重大错误的情况。如果您的操作规则需要有限的小数位数,则将每个值存储为整数,通过乘以10^(所需的小数位数),然后除以10^(所需的小数位数)来获得实际值,将避免任何累积错误。

在不出现小数的情况下(例如,自动售货机),根本没有理由使用非整型。简单地把它想象成数便士,而不是数美元。我曾见过一些代码,其中每次计算都只涉及整个便士,但使用double会导致错误!只有整数数学解决了这个问题。所以我非传统的回答是,如果可能的话,放弃双位数和小数点。

如果您需要使用其他语言或平台进行二进制查询,那么您可能需要使用float或double,它们是标准化的。

这取决于你要它做什么。

因为浮点数和双精度数都是二进制数据类型,所以在整数四舍五入的方法上存在一些困难和错误,例如双精度数会四舍五入0.1到0.100000001490116,双精度数也会四舍五入1 / 3到0.33333334326441。简单地说,不是所有的实数在双类型中都有准确的表示

幸运的是,c#还支持所谓的十进制浮点算术,其中数字通过十进制数字系统而不是二进制系统表示。因此,十进制浮点算术在存储和处理浮点数时不会丢失精度。这使得它非常适合需要高精度的计算。

选择应用程序的功能类型。如果你需要像财务分析那样的精确性,那么你已经回答了你的问题。但如果你的申请可以解决一个估计,你可以接受双倍。

你的申请需要快速计算还是他有足够的时间给你答案?这取决于应用程序的类型。

图形饿了吗?Float或double就足够了。金融数据分析,流星撞击行星的精准度如何?这些都需要一点精确度:)

I think you've summarised the advantages quite well. You are however missing one point. The decimal type is only more accurate at representing base 10 numbers (e.g. those used in currency/financial calculations). In general, the double type is going to offer at least as great precision (someone correct me if I'm wrong) and definitely greater speed for arbitrary real numbers. The simple conclusion is: when considering which to use, always use double unless you need the base 10 accuracy that decimal offers.

编辑:

关于您关于操作后浮点数精度下降的附加问题,这是一个稍微微妙的问题。实际上,每次操作执行后,精度(我在这里交替使用准确性这个术语)都会稳步下降。这有两个原因:

某些数字(最明显的是小数)不能真正地用浮点形式表示 会出现舍入错误,就像手工计算一样。然而,这些错误是否严重到值得仔细考虑,很大程度上取决于上下文(您正在执行多少个操作)。

在所有情况下,如果您想比较理论上应该等效的两个浮点数(但使用不同的计算方法得到),则需要允许一定程度的容错(容错程度不同,但通常非常小)。

有关可能引入准确性错误的特定情况的更详细概述,请参阅维基百科文章的准确性部分。最后,如果你想深入地(和数学地)讨论机器级别的浮点数/操作,试着阅读经常被引用的文章《每个计算机科学家都应该知道浮点算术》。