2011-05-14 50 views
-1

所以我有以下代码:UIProgressView进展乘以一个数字返回奇怪的结果

angle = progbm.progress * 30; 
NSLog(@"%d,%f", angle, progbm.progress); 

progbm是UIProgressView(从0.0到运行1.0)和角是短。

在其他地方,我有更新进度条的代码向上或向下0.1。我似乎得到了一些奇怪的结果。这里是控制台输出:

2011-05-14 15:21:25.265 AppTest [768:307] 3,0.100000
2011-05-14 15:21:26.238 AppTest [768:307] 6,0.200000
2011-05-14 15:21:27.245 AppTest [768:307] 9,0.300000
2011-05-14 15:21:28.061 AppTest [768:307] 12,0.400000
2011-05-14 15 :21:28.940 AppTest [768:307] 15,0.500000
2011-05-14 15:21:29.820 AppTest [768:307] 18,0.600000
2011-05-14 15:21:30.716 AppTest [768: 307] 21,0.700000
2011-05-14 15:21:31.644 AppTest [768:307] 24,0.800000
2011-05-14 15:21:32.860 AppTest [768:307] 27,0.900000
2011-05-14 15:21:34.460 AppTest [768:307] 30,1.000000
2011-05-14 15 :21:39.020 AppTest [768:307] 27,0.900000
2011-05-14 15:21:40.173 AppTest [768:307] 23,0.800000

如何0.800000 * 30等于23?

+0

你被一个int乘以一个浮动('progress')('30'),它给你一个浮动,然后你使用INT格式说明'% d'打印它。改用'%f'。 – 2011-05-14 03:37:57

+0

它的好 - 我刚刚在我的计算中添加了一个round(),以确保它给出正确的结果。只是奇怪的行为。 – sregorcinimod 2011-05-14 03:39:50

+0

@Josh为什么他应该这样做? – 2011-05-14 03:48:28

回答

1

有两个答案,这一点,无论

1)使用圆形()来获取短期的整数值。
2)不要使用短暂的而是使用float。

我最终使用选项2

0

我的猜测是四舍五入的错误,没有显示与NSLog的打印精度。当你从1.0中减去0.1时,你不一定会得到0.9。如果我没有记错,在浮点符号中不能精确地表示0.1,因为在二进制中它是一个重复的小数。所以你最终会得到类似0.899999或0.90000001的东西。然后,当你从中减去另一个0.1时,它看起来像是以0.7999999999结尾,其中NSLog将四舍五入为0.800000进行打印,但整数乘法总是向下舍入,因此23.9999999被舍入为23.

-1

您不是'考虑到进展正在进行。 :-)它会在计算和显示之间变化。将progbm.progress存储到您用于计算和显示的变量中,并且问题将消失。

+0

不,进程的值不会在这两行之间更新,除非它在后台线程上运行。 – 2011-05-14 03:59:21