2013-02-27 82 views
0

在我的應用程序中,我只是將50除以3我想存儲此確切的結果值。 如果我使用float,它給出16.666666,如果我使用double,那麼它給出16.666667。哪種數據類型應該用於iOS中的長浮動值?

實際上,我通過劃分框架高度來決定每個標籤的高度,從而在框架內創建三個標籤。所以如果我沒有得到確切的價值,它會在標籤之間產生差距。如果我通過60,那麼它可以正常工作,因爲60/3的結果是20,但是如果我通過50,那麼就有差距。

+0

你想要比以上函數更長的值已經返回嗎? – 2013-02-27 05:23:57

+0

你期望看到什麼樣的價值? – JeremyFromEarth 2013-02-27 05:24:06

+2

50÷3的確切結果不能有限地存儲,除非作爲比例。請詳細瞭解您的目標。 – 2013-02-27 05:26:23

回答

2

如果你想讓你的框架分成三個等高的區域,那麼你的框架的像素高度需要被三個整除。你不能顯示分數像素,它們是不可分的;以像素爲單位測量的每個高度需要是整數。

+0

此外,即使您可以設置窗口大小的分數寬度和點數,您也不應該這樣做,因爲它通常最終會將略微偏離視圖的所有內容渲染爲模糊。實際上有一個方法,CGRectIntegral(),恰恰是爲了正確地舍入爬到CGRect視圖框架中的任何非整數值。 – 2013-02-27 08:05:12

+0

但是在CGRectMake接受CGFloat類型的參數時,它應該接受小數值。 – user1787741 2013-02-27 08:25:56

+0

@ user1787741:是的,'CGRectMake'需要'CGFloat'參數,但分數50/3不是浮點數!此外,該設備只有離散像素,因此我也認爲'CGRectIntegral()'是解決這個問題的正確方法。 – 2013-02-27 08:53:52

1

存儲「精確」值的唯一方法是創建一個名爲「Rational」(或類似)的類,並將分數的分子和分母作爲單獨的ivars存儲。 Floatsdoubles(或任何有關此事的文字計算機表示)不能存儲具有無限數量的小數位或超越實數的有理數。

用「理性的」類將是存儲分子和分母,然後應用適當的數學運用到這些值(如果你想傳播「精確」通過程序)的方式。稍微簡單一些的方法是將有理數作爲分子和分母顯示,但使用float/double近似值作爲基礎數學。

0
float t= (float)50/3; 
long double t1= (long double)50/3; 

NSLog(@"%.30f  %.30LF",t, t1); 

產生的輸出 「16.666666030883789062500000000000 16.666666666666666666088425508008」。

我建議你去用長雙,這不是確切但足夠精確。

+0

是的,我之前做過,對於NSLOG,您可以指定精度值,但是如何在CGRECTMake中傳遞此值 – user1787741 2013-02-27 08:23:07

+0

您可以將精度設置爲僅查看控制檯中的數字。由於CGRectMake將CGFloat(typedef'd float)作爲參數,所以它的精度將爲7位小數。 – Shashank 2013-02-27 09:37:49

+0

因此,無論您發送CGRectMake方法將會考慮多達7位小數位,我不認爲發送浮點數或雙精度數據會產生很大的可見差異。 – Shashank 2013-02-27 09:45:54

相關問題