奇怪问题:为什么有时候两个相同数字比较时会出现不相等的状况。

xinglinshu 2003-10-09 03:54:04
经过四舍五入处理的两个相同数字float型,在下面情况下不相等:
var
a,b :real;
if a = b then
.....
我在单步运行中看到a和b都是2.04,但他就是返回false,奇怪!
...全文
729 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
耙子 2003-10-09
  • 打赏
  • 举报
回复
uses math;
....
if abs(sumd-sumj)<0.001 then
begin
equal := true;
end

改成这样就行了
耙子 2003-10-09
  • 打赏
  • 举报
回复
由于2进制和10进制转化是浮点数存在精度问题,所以通常的浮点书比较是采用 差的绝对值小于允许误差的方式

浮点数a, b, 允许误差 deta
那么写作

if (abs(a-b)<deta)
//认为相等



楼上的写法有点问题,应该加上绝对值

if (abs(a-b) < 0.0000001) then
begin
end;
xinglinshu 2003-10-09
  • 打赏
  • 举报
回复
那应如何比较?请高手指教!
cow8063 2003-10-09
  • 打赏
  • 举报
回复
real不应这样比较大小,他们看来相等,其实不等的,因为有精度的问题在
tigerhohoo 2003-10-09
  • 打赏
  • 举报
回复
比较 real 的还是应该加上一个范围比较好
if (a-b < 0.0000001) then
begin
end;
xinglinshu 2003-10-09
  • 打赏
  • 举报
回复
有初始值,在这我没写,
function TPUMCredenceFrm.equal: boolean;
var
sumj,sumd : real;
i : integer;
begin
sumj := 0;
sumd := 0;
dmPUCredence.adryDetilQuery.First;
for i := 0 to dmPUCredence.adryDetilQuery.RecordCount -1 do
begin
sumj := sumj + dmPUCredence.adryDetilQuery.FieldByName('MoneyAmountDr//金额').AsFloat;
sumd := sumd + dmPUCredence.adryDetilQuery.FieldByName('MoneyAmountCr//金额').AsFloat;
dmPUCredence.adryDetilQuery.Next;
end;
if sumd = sumj then
begin
equal := true;
end
else
begin
equal := false;
end;
end;
以上是完整的函数,金额是两位小数,运行后sumd = sumj都等于2.04,但就是返回false我要是手工把sumd 和sumj都减0.1之后就返回真了。
sailer_shi 2003-10-09
  • 打赏
  • 举报
回复
你试一下用Double的类型呢
还有你没有定义初始值呀

5,930

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧