在Delphi中,如何确定何时使用Real、Real48、Double或Single数据类型?

在Delphi中,如何确定何时使用Real、Real48、Double或Single数据类型?,delphi,types,compatibility,Delphi,Types,Compatibility,我的大多数应用程序都围绕着财务计算,包括付款和利率计算。我想知道如何确定什么样的Delphi数据类型最适合使用 如果我使用一个数据库来存储这些值,并且我已经将该数据库中的字段定义为带两位小数的十进制值,那么哪个Delphi数据类型与该场景最兼容 在将值存储到数据库之前,是否应该在Delphi中使用舍入公式将结果格式化为两位小数?如果是这样的话,那么这样做的最佳实践是什么?如果要进行财务计算,请不要使用任何浮点/实数类型。Delphi有一种货币类型,它是一个小数点后4位的定点值,这正是您所需要的。

我的大多数应用程序都围绕着财务计算,包括付款和利率计算。我想知道如何确定什么样的Delphi数据类型最适合使用

如果我使用一个数据库来存储这些值,并且我已经将该数据库中的字段定义为带两位小数的十进制值,那么哪个Delphi数据类型与该场景最兼容


在将值存储到数据库之前,是否应该在Delphi中使用舍入公式将结果格式化为两位小数?如果是这样的话,那么这样做的最佳实践是什么?

如果要进行财务计算,请不要使用任何浮点/实数类型。Delphi有一种货币类型,它是一个小数点后4位的定点值,这正是您所需要的。

对于这种计算,不要使用诸如Real、Single或Double之类的浮点类型。它们不适用于0.01或1234.995等十进制值,因为它们必须是近似值

您可以使用货币,一种固定点类型,但仍限于小数点后4位


试试我的类型,它有28-29位,并且有一个十进制指数,所以它非常适合这样的计算。唯一的缺点是,它不支持FPU(但却是用汇编语言编写的),因此它不如内置类型快。它与.NET中使用的十进制类型相同(但速度稍快),与Mac上使用的十进制类型非常相似。

Mason的建议是正确的。不管它值多少钱,Real48永远都不合适。@David:同意。Real48是一种古老的类型,仅为向后兼容而保留,不应在现代代码中使用。您还忘记了
Extended
作为浮点类型和
Currency
作为定点类型。对于浮点类型,舍入是必须的。总是
Real48
用于软件浮点运算(精度稍高,但比硬件慢几倍)。在有效数字上:
单个
似乎仅略为足够,因此可以使用
(基本上与
相同)。研究这张表:@Downvoter等:Real48不再是一个软件FP。它被简单地转换为扩展,传递给FPU,结果被转换回。@David Heffernan:货币没有基数10,但也有基数2。货币被存储为一个按比例缩放的64位整数,其中四个最低有效位隐式表示小数位数。那个么在这个例子中我应该使用什么数据类型:1000.00赚取5%的利息每日复利多少利息?答案=0.05/365*(1000)或0.14。中间计算0.05/365需要至少有5位(最好是7位)小数位。在计算的其余部分使用货币之前,货币不是会将0.05/365截断为0.0001吗?或者它是否保持其内部值0.000136986301。。。在剩下的计算中使用它?@Cape:乘法和除法是可交换的。请改为尝试0.05*1000/365。顺便说一句,与其他80x87类型一样,
Currency
也会累积计算错误。@David查看生成的asm,您会发现
Currency
算法是用x87操作码实现的(至少在32位Delphi中)。但由于它使用这些操作码的“i”(整数)版本,因此这里没有浮点舍入或错误。但是,您只需使用
PInt64(@aCurcr)
指针类型转换(*10000)就可以安全地进行货币计算。您是否计划更新到新的xe2目标?是的,我计划在x64汇编程序中重做汇编程序。我想它应该会让一些事情变得更容易(更大的寄存器,更多的寄存器,所以可能根本不需要使用本地变量),而有些事情则不会(x64汇编程序是更严格的WRT序言和尾声代码,等等)。@Rudy-感谢链接。不幸的是,我不能使用您的十进制类型,原因如下。我想将所有计算推送到数据库中的存储过程中。我发现Delhpi、MS Sql Server和ElevateDB的数学计算方法都略有不同。如果我在Delphi中进行计算并将结果写入数据库,那么我有几个DB I/O。如果我在存储过程中进行计算,那么我需要确保计算结果与Delphi的相同。然而,我接受了你的答案,因为它让我回到了画板上,一路反思。