2011-05-14 48 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