德尔福 - 比较两个" Real"数字变量

时间:2016-03-19 14:52:49

标签: delphi floating-point

我有两个变量的比较问题" Real"类型。一个是数学运算的结果,存储在数据集中,第二个是表单中的编辑字段的值,由StrToFloat转换并存储到" Real"变量。问题是这样的: 121,97 not equal to 121,97

正如你所看到的,程序试图告诉我,121,97不等于121,97 ......我读过 this topic,我并不完全确定,这是同样的问题。如果是,那么存储在变量中的数字不会是完全相同的最接近的可表示数字,对于121.97是121.96999 99999 99998 86313 16227 83839 70260 62011 71875吗?

现在让我们说它们不会存储为相同的最接近的可表示数字。我怎样才能找到它们的存储方式?当我查看" CPU"调试窗口,我完全迷失了。我看到地址,那些值应该是,但是没有什么甚至类似于一些二进制,十六进制或实际数字的任何表示...我承认,高级调试对我来说是未知的宇宙......

编辑: 这两个值确实略有不同。

enter image description here

好的,我不需要了解一切。虽然我没有处理钱,但最多会有3位小数,所以"货币"是出路

顺便说一句:计算是:

DATA[i].Meta.UnUsedAmount := DATA[i].AMOUNT - ObjQuery.FieldByName('USED').AsFloat;

在这种情况下,它是3695 - 3573.03

1 个答案:

答案 0 :(得分:10)

由于未知原因,您无法在监视列表中将浮点值(单/双或实数48)视为十六进制。

但是,您仍然可以通过将其视为内存转储来查看十六进制表示 这是如何做: 将变量添加到监视列表中 右键单击手表 - >编辑观看...
将其视为memory dump

enter image description here

现在您可以比较调试器中的两个值。

永远不要使用浮动货币金额
你当然知道你不应该用花车来计算钱数 你会因为四舍五入而遇到各种各样的麻烦,比较也不会按照你想要的方式运作 如果您想使用资金,请使用currency类型。它没有这些问题,支持4位小数,可以使用=运算符进行比较,没有舍入问题。

在数据库中,您使用moneycurrency数据类型。