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

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

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

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

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


当前回答

这取决于你要它做什么。

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

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

其他回答

像其他人建议的那样,以10为基数的值使用十进制,例如财务计算。

但是对于任意的计算值,double通常更准确。

例如,如果你想计算投资组合中每一行的权重,使用double,因为结果加起来更接近100%。

在下面的例子中,doubleResult比decimalResult更接近1:

// Add one third + one third + one third with decimal
decimal decimalValue = 1M / 3M;
decimal decimalResult = decimalValue + decimalValue + decimalValue;
// Add one third + one third + one third with double
double doubleValue = 1D / 3D;
double doubleResult = doubleValue + doubleValue + doubleValue;

还是以投资组合为例:

投资组合中每一行的市场价值都是一种货币价值,可能最好用十进制表示。 投资组合中每一行的权重(=市场价值/ SUM(市场价值))通常用双数表示更好。

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

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

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

如果你更看重性能而不是正确性,请使用浮点数。

这取决于你要它做什么。

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

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

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