【发布时间】:2016-03-19 14:52:49
【问题描述】:
我在比较“Real”类型的两个变量时遇到问题。一个是数学运算的结果,存储在数据集中,第二个是表单中编辑字段的值,由 StrToFloat 转换并存储到“Real”变量中。问题是这样的:
如您所见,程序试图告诉我,121,97 不等于 121,97...我已阅读
this topic,我不完全确定这是同一个问题。如果是,那么存储在变量中的两个数字不会是完全相同的最接近的可表示数字,对于 121.97,它是 121.96999 99999 99998 86313 16227 83839 70260 62011 71875 吗?
现在假设它们没有存储为相同的最接近的可表示数字。我如何找到它们的存储方式?当我查看“CPU”调试窗口时,我完全迷失了方向。我看到了地址,这些值应该在哪里,但没有任何类似于二进制、十六进制或实际数字的任何表示的东西......我承认,高级调试对我来说是未知的世界......
编辑: 这两个值确实略有不同。
好的,我不需要了解所有内容。虽然我不是在处理金钱,但最多会有3位小数,所以“货币”是出路
顺便说一句:计算是:
DATA[i].Meta.UnUsedAmount := DATA[i].AMOUNT - ObjQuery.FieldByName('USED').AsFloat;
在这种情况下,它是 3695 - 3573.03
【问题讨论】:
-
参见 JIRA RSP-13792。您可能想要调用
comparevalue函数。 -
@Magoo 那份报告是假的。编译器行为正确。
-
StrToFloat应该如你所说。但是其他值呢?它是如何计算的。我认为您应该关注我们看不到的实际问题。 -
在inspector/watch窗口中将变量可视化为二进制,你会发现它不一样...
-
使用
currency表示金额。你所有的问题都会迎刃而解。
标签: delphi floating-point