[Delphi] if 判斷式的陷阱

出處 : http://codingma.blogspot.tw/2012/06/delphi-if.html

function example(IntA, IntB, Check: Integer;): Boolean;
var
  Rate: Double;
begin
  Result := False;
  Rate := IntA / IntB;
  if Rate * 100 >= Check then
    Result := True;
end;

上面這個例子 傳入 IntA := 980; IntB := 1000; Check := 98;
大家都知道傳入上面3個參數值後, 回傳值應該是 True 才對,
但詭異的事情就這麼發生了..

在電腦a 它確實回傳 True
可是在電腦b 怎麼樣都給我回傳 False
為了這個問題,我們花了3~4個小時在除錯
最後終於找到答案了,

沒錯,重點就是在 if 這個判斷式上面..
平常我們 if A >= B then 這樣都是ok的..
但今天這個判斷式大家有沒有注意到它有什麼不一樣..

對, Rate*100 這不是一個變數,而是一個運算式
在Delphi的世界裡, 這樣寫是可以判斷沒錯..
但請注意 Rate*100 所得到的值會先被暫存起來
而暫存這個值的型別,Delphi在這裡會使用Double這個型別.

也許你會說.就算是這樣..那也沒問題丫..
錯了!問題就出在這個型別,我們很天真的認為
980/1000 = 0.98
0.98 *100 = 98
但其實Double存的值是  97.99999982
我看到的是這個值,小數點後幾個9我是忘了..
但值確是是這樣...所以判斷式一判斷下去
if 97.99999982 >= 98 then 這樣當然不成立

這個問題花費了我們不少時間,在這裡貼出來..
希望不在再有人掉入這個陷阱裡囉~^_^~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值