您的位置:首页 > 移动开发 > IOS开发

iOS float类型不精确

2015-11-18 15:36 1096 查看
如 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范围内却条件成立

      修改后却不成立了

更多0分享到:

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
回复次数:10




kye_jufei
kye_jufei
本版等级:



 

 

#1 得分:5回复于: 2010-09-02 09:56:03

應該是條件代碼問題,你設置一個斷點,把每一步的結果show出來看一下結果。。。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理





bdmh 


bdmh
本版等级:



 

 

更多勋章
#2 得分:15回复于: 2010-09-02 09:56:18

double的类型的存储比较特殊,你可以查看相关资料,虽然你给的是0.02的值,但是内存中可能是0.019999999999999
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理





shao113112
shao113112
本版等级:


#3 得分:0回复于: 2010-09-02 09:59:40

引用 2 楼 bdmh 的回复:

double的类型的存储比较特殊,你可以查看相关资料,虽然你给的是0.02的值,但是内存中可能是0.019999999999999

这点我了解,但是为什么通过str和float的2次转换就不出现这个问题了哈?
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理





shao113112
shao113112
本版等级:


#4 得分:0回复于: 2010-09-02 10:00:51

引用 1 楼 kye_jufei 的回复:

應該是條件代碼問題,你設置一個斷點,把每一步的結果show出來看一下結果。。。

不是代码问题,应该是2楼说的0.0199999999999的问题
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理





chenzhuo
chenzhuo
本版等级:



 

#5 得分:5回复于: 2010-09-02 11:39:09

FieldByName(x[0]).AsCurrency -FieldByName(x[1]).AsCurrency
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理





goodhj
goodhj
本版等级:


#6 得分:0回复于: 2010-09-02 11:46:23

引用 5 楼 chenzhuo 的回复:

FieldByName(x[0]).AsCurrency -FieldByName(x[1]).AsCurrency

正解
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理





yuweihua86
yuweihua86
本版等级:


#7 得分:0回复于: 2010-09-02 11:46:49

如果是货币的还是用这个AsCurrency这个比较好把,我比较喜欢用value这个。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理





shao113112
shao113112
本版等级:


#8 得分:0回复于: 2010-09-02 12:21:45

谢谢楼上几位了。

其实我需要解释 strtofloat(Floattostr(cal)) 这个。。。

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理





iamduo
iamduo
本版等级:


#9 得分:15回复于: 2010-09-02 12:34:03

Floattostr(cal)根据本地设置(通常是小数点8位),已经做了精度调整。

然后再 StrToFloat 得到的值,自然跟 cal 有所区别。

还有,real 我记得没错的话,就是 single 吧。

single 是8位有效(含小数点前面的位数),8位之外的,就是随便什么数字都有可能。

可以用 Double 试试看,这个直接玩 16 位,相对来说准确多了。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理





shao113112
shao113112
本版等级:


#10 得分:0回复于: 2010-09-02 12:41:17

嗯,不错。谢谢大家啦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: