Delphi 德尔福+;Firebird(使用DBExpress):使用TFMTBCDField聚合问题

Delphi 德尔福+;Firebird(使用DBExpress):使用TFMTBCDField聚合问题,delphi,aggregate,firebird,numeric,Delphi,Aggregate,Firebird,Numeric,我的数据库中有一个带有数值(15,2)字段的表。在Delphi中,我使用trioTSQLDataset+TDataSetProvider+TClientDataSet。此字段创建为TFMTBCDField。问题是,我需要在我的ClientDataSet中使用聚合字段,以便对值求和,但由于某些原因,它没有正确计算(请参见下图)。但是,如果我在数据库中将字段类型设置为DOUBLE PRECISION(Delphi在数据集中将字段创建为TFloatField),则聚合将按预期工作 PS:我在某个地方读

我的数据库中有一个带有
数值(15,2)
字段的表。在Delphi中,我使用trio
TSQLDataset
+
TDataSetProvider
+
TClientDataSet
。此字段创建为
TFMTBCDField
。问题是,我需要在我的
ClientDataSet
中使用聚合字段,以便对值求和,但由于某些原因,它没有正确计算(请参见下图)。但是,如果我在数据库中将字段类型设置为
DOUBLE PRECISION
(Delphi在数据集中将字段创建为
TFloatField
),则聚合将按预期工作

PS:我在某个地方读到过,在Firebird中使用
数值
比使用
双精度
更好

  • 我正在使用DelphiXe7和Firebird 2.5

你如何处理这个问题?
谢谢。

TFMTBCDField是一个二进制编码的十进制字段,Firebird不使用二进制编码的十进制,也许这就是加法失败的原因。“使用数字比使用双精度更好”-不知道你的意思。没有“一刀切”的普遍规律,在这些情况下有一些特定的情况和特定的陷阱,最好避免。在这种广义形式下,你的规则听起来很奇怪,确实如此。传统的“方言1”和现代的“方言3”在数字处理上存在不一致性,但通过显式使用DOUBLE而不是数字来解决这一问题@Markrottveel关于Firebird你是对的。但是数字和十进制数据类型从Delphi中的DbExpress驱动程序映射到TFMTBCD(TFMTBCDField)。@ValMarinov哦,我实际上不知道Delphi,所以我只是猜测原因。
TClientDataSet
不是DBX,它是MIDAS aka DataSnap。无论如何,为什么不将字段的类型从BCD更改为一些实数字段类,然后再试一次呢?