如 float x = 0.01999999999

用nslog输出是 0.02

例:要求对2个值进行0.02的超差判定
  第一次:
   if abs(FieldByName(x[0]).AsFloat -FieldByName(x[1]).AsFloat) >0.02 then
     showmessage('超差');      
    问题出现:>号前面值等于0.02时,显示超差。
  经过修改如下
      添加1个cal:real;
      cal := abs(strtofloat(FieldByName(x[0]).text) - strtofloat(FieldByName(x[1]).text));
      if  strtofloat(Floattostr(cal)) > 0.02 then
        showmessage('超差');
     这次,值0.02时没有显示超差。   
  

求解,为什么第一次取绝对值时明明0.02不属于>0.02范围内却条件成立
      修改后却不成立了





應該是條件代碼問題,你設置一個斷點,把每一步的結果show出來看一下結果。。。
double的类型的存储比较特殊,你可以查看相关资料,虽然你给的是0.02的值,但是内存中可能是0.019999999999999
这点我了解,但是为什么通过str和float的2次转换就不出现这个问题了哈?
不是代码问题,应该是2楼说的0.0199999999999的问
FieldByName(x[0]).AsCurrency -FieldByName(x[1]).AsCurrency
如果是货币的还是用这个AsCurrency这个比较好把,我比较喜欢用value这个。
其实我需要解释 strtofloat(Floattostr(cal)) 这个。。。
Floattostr(cal)根据本地设置(通常是小数点8位),已经做了精度调整。      
 然后再 StrToFloat 得到的值,自然跟 cal 有所区别。      
 还有,real 我记得没错的话,就是 single 吧。      
 single 是8位有效(含小数点前面的位数),8位之外的,就是随便什么数字都有可能。      
 可以用 Double 试试看,这个直接玩 16 位,相对来说准确多了。