Delphi 德尔菲法——两种方法的比较;“真正的”;数字变量

Delphi 德尔菲法——两种方法的比较;“真正的”;数字变量,delphi,floating-point,Delphi,Floating Point,我对比较两个“实”型变量有问题。一个是数学运算的结果,存储在数据集中,第二个是编辑字段的值,格式为StrToFloat,并存储为“实”变量。问题是: 如你所见,程序试图告诉我,121,97不等于121,97。。。我读过 ,我不能完全肯定这是同一个问题。如果是,那么存储在变量中的两个数字不是完全相同的最接近的可表示数字吗?对于121.97,它是121.96999 999998 86313 16227 839 70260 62011 71875 现在让我们假设它们不是存储为同一个最近的可表示数字。

我对比较两个“实”型变量有问题。一个是数学运算的结果,存储在数据集中,第二个是编辑字段的值,格式为StrToFloat,并存储为“实”变量。问题是:

如你所见,程序试图告诉我,121,97不等于121,97。。。我读过 ,我不能完全肯定这是同一个问题。如果是,那么存储在变量中的两个数字不是完全相同的最接近的可表示数字吗?对于121.97,它是
121.96999 999998 86313 16227 839 70260 62011 71875

现在让我们假设它们不是存储为同一个最近的可表示数字。如何找到它们的具体存储方式?当我查看“CPU”调试窗口时,我完全不知所措。我看到了地址,这些值应该在哪里,但与二进制、十六进制或实际数字的任何表示形式都不相似。。。我承认,高级调试对我来说是未知的

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

好吧,我不需要什么都懂。虽然我不是在和钱打交道,但小数点后最多有3位,所以“货币”才是出路

顺便说一句:计算如下:

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

在本例中,它是3695-3573.03,由于未知原因,您无法在监视列表中以十六进制形式查看浮点值(单/双或实48)

但是,您仍然可以通过将十六进制表示形式视为内存转储来查看它。
以下是方法: 将变量添加到监视列表。
右键单击手表->编辑手表…
将其视为
内存转储

现在可以在调试器中比较这两个值

切勿将浮动用于货币金额
您当然知道,您不应该使用浮点数钱。
舍入会给你带来各种麻烦,比较也不会按你想要的方式进行。
如果要使用货币,请使用
货币
类型。它没有这些问题,支持4位小数,可以使用
=
运算符进行比较,没有舍入问题


在数据库中,您使用
money
currency
数据类型

见JIRA RSP-13792。您可能想调用
comparevalue
函数。@Magoo该报告是假的。编译器运行正常。
StrToFloat
应按您所说的方式运行。但另一个价值呢?它是如何计算的。我认为您应该关注实际问题,这是我们看不到的。在inspector/watch窗口中将变量可视化为二进制,您将看到它是不同的…使用
货币
获取金额。你所有的问题都会消失的。是的,但当你在赚钱的时候就不会了。更新了答案。除非你确切地知道你在做什么,否则与浮点数进行相等比较会带来灾难谢谢!能否简要描述一下我在内存转储中看到的内容?我很抱歉地说,但我还没有成功地弄明白。。。我的意思是-121.97的十六进制表示法是0x42f3f0a4…该表示法对于双精度是正确的,您可能在谈论单精度或-shubder-
real48
。这些值的二进制表示是不同的。啊,好吧,这超出了我的想象。。。但是非常感谢你的帮助help@DavidHeffernan是的,我指的是货币。在我的母语中,表示货币金额和其他金额的词是不同的。我一直忘了英语中的数量也可以用来表示无聊的旧数量的其他东西。