【轉】Android 爲何 dp2px 或 px2dp 公式須要加 0.5f

轉自:http://blog.csdn.net/changcsw/article/details/52440543java

網上 dp2px 和 px2dp 公式:spa

 

[java]  view plain  copy
 
  1. public static int px2dip(Context context, float pxValue) {    
  2.      final float scale = context.getResources().getDisplayMetrics().density;    
  3.      return (int) (pxValue / scale + 0.5f);    
  4. }    
  5.       
  6. public static int dip2px(Context context, float dipValue) {    
  7.      final float scale = context.getResources().getDisplayMetrics().density;    
  8.      return (int) (dipValue * scale + 0.5f);    
  9. }  

這兩個公式網上不少,但爲何 最後都要加上0.5f 呢?.net

 

 按正常的推理應該是  dip = pxValue / scale 和 px = dipValue * scale ,blog

實際上準確的值就應該是 我們推理出來的,之因此後面加上0.5f是由於 我們要的只不是那麼精準,根據推理算出來的是個浮點數,而我們程序中通常使用int類型就夠了,這裏涉及到一個類型轉換精準度問題,熟悉java特效的同窗應該知道ip

float 類型的 4.1 和4.9 強轉成int類型後,會失去精準度變成 int類型的4, 而若是我們想四捨五入的話,把他們都加上0.5f,這樣轉換出來的結果就是:get

4.4 + 0.5 = 4.9 轉爲int 仍是4,而4.5 + 0.5 = 5.0 轉換成int後就是5,正好是四捨五入,這樣就保證了我們算出來的值相對精準。it

相關文章
相關標籤/搜索