在我的應用程序中,我只是將50除以3我想存儲此確切的結果值。 如果我使用float,它給出16.666666,如果我使用double,那麼它給出16.666667。哪種數據類型應該用於iOS中的長浮動值?
實際上,我通過劃分框架高度來決定每個標籤的高度,從而在框架內創建三個標籤。所以如果我沒有得到確切的價值,它會在標籤之間產生差距。如果我通過60,那麼它可以正常工作,因爲60/3的結果是20,但是如果我通過50,那麼就有差距。
在我的應用程序中,我只是將50除以3我想存儲此確切的結果值。 如果我使用float,它給出16.666666,如果我使用double,那麼它給出16.666667。哪種數據類型應該用於iOS中的長浮動值?
實際上,我通過劃分框架高度來決定每個標籤的高度,從而在框架內創建三個標籤。所以如果我沒有得到確切的價值,它會在標籤之間產生差距。如果我通過60,那麼它可以正常工作,因爲60/3的結果是20,但是如果我通過50,那麼就有差距。
如果你想讓你的框架分成三個等高的區域,那麼你的框架的像素高度需要被三個整除。你不能顯示分數像素,它們是不可分的;以像素爲單位測量的每個高度需要是整數。
此外,即使您可以設置窗口大小的分數寬度和點數,您也不應該這樣做,因爲它通常最終會將略微偏離視圖的所有內容渲染爲模糊。實際上有一個方法,CGRectIntegral(),恰恰是爲了正確地舍入爬到CGRect視圖框架中的任何非整數值。 – 2013-02-27 08:05:12
但是在CGRectMake接受CGFloat類型的參數時,它應該接受小數值。 – user1787741 2013-02-27 08:25:56
@ user1787741:是的,'CGRectMake'需要'CGFloat'參數,但分數50/3不是浮點數!此外,該設備只有離散像素,因此我也認爲'CGRectIntegral()'是解決這個問題的正確方法。 – 2013-02-27 08:53:52
存儲「精確」值的唯一方法是創建一個名爲「Rational」(或類似)的類,並將分數的分子和分母作爲單獨的ivars存儲。 Floats
和doubles
(或任何有關此事的文字計算機表示)不能存儲具有無限數量的小數位或超越實數的有理數。
用「理性的」類將是存儲分子和分母,然後應用適當的數學運用到這些值(如果你想傳播「精確」通過程序)的方式。稍微簡單一些的方法是將有理數作爲分子和分母顯示,但使用float/double
近似值作爲基礎數學。
float t= (float)50/3;
long double t1= (long double)50/3;
NSLog(@"%.30f %.30LF",t, t1);
產生的輸出 「16.666666030883789062500000000000 16.666666666666666666088425508008」。
我建議你去用長雙,這不是確切但足夠精確。
是的,我之前做過,對於NSLOG,您可以指定精度值,但是如何在CGRECTMake中傳遞此值 – user1787741 2013-02-27 08:23:07
您可以將精度設置爲僅查看控制檯中的數字。由於CGRectMake將CGFloat(typedef'd float)作爲參數,所以它的精度將爲7位小數。 – Shashank 2013-02-27 09:37:49
因此,無論您發送CGRectMake方法將會考慮多達7位小數位,我不認爲發送浮點數或雙精度數據會產生很大的可見差異。 – Shashank 2013-02-27 09:45:54
你想要比以上函數更長的值已經返回嗎? – 2013-02-27 05:23:57
你期望看到什麼樣的價值? – JeremyFromEarth 2013-02-27 05:24:06
50÷3的確切結果不能有限地存儲,除非作爲比例。請詳細瞭解您的目標。 – 2013-02-27 05:26:23