gpt4 book ai didi

Delphi - 两个 "Real"数字变量的比较

转载 作者:行者123 更新时间:2023-12-03 14:52:03 26 4
gpt4 key购买 nike

我在比较“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

最佳答案

出于未知原因,您无法在监视列表中查看十六进制的浮点值(单精度/ double 或实数 48)。

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

enter image description here

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

切勿使用 float 表示货币金额
您当然知道不应该使用 float 来数钱。
您将在舍入方面遇到各种麻烦,并且比较也不会按照您希望的方式进行。
如果您想使用货币,请使用 currency 类型。它不存在这些问题,支持 4 位小数,并且可以使用 = 运算符进行比较,没有舍入问题。

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

关于Delphi - 两个 "Real"数字变量的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36103196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com