php - neden kat tamsayı aşağı yuvarlamak nedir?

6 Cevap

Ben neden olarak karıştı:

echo log10(238328) / log10(62);

3 sonuçları

ancak

echo floor(log10(238328) / log10(62));

2 sonuçları

I know floor rounds down ancak I thought it was only for decimal numbers.

Nasıl hala normalde aşağı yuvarlama iken ikincisi statment 3 dışarı bir cevap alabilirsiniz?

6 Cevap

PHP çift duyarlıklı kayan nokta numaraları kullanır. İki logaritma sonuçlarının ne tam olarak temsil edilebilir, bu yüzden onları bölünmesi sonucu kesin değildir. Alacağınız sonuç, yakın, ama echo tarafından biçimlendirilmiş edilirken 3'ten biraz az. Bu 3 yuvarlanır alır. floor, bununla birlikte 2 döndürür.

Sen log(x, b) / log(y, b) eşdeğer olduğu gerçeği yararlanarak hatalı bölünme önleyebilirsiniz log(x, y) (herhangi bir üs için b). Bu size tam 3 bir kayan nokta sonuç vardır ifadeyi log(238328, 62) yerine verir (doğru sonucu 238328 yılından bu yana pow(62, 3)).

Bu kayan nokta sayılar PHP parlatılır şekilde nedeniyle bulunuyor.

the PHP Manual's Floating Point Numbers entry daha fazla bilgi için bkz:

Bir geçici çözüm floor(round($value, 15)); etmektir. Bunu yaparsanız sayı oldukça doğru bir cilalı sağlayacaktır.

Eğer var_dump Eğer "3" aslında bir şamandıra olduğunu görürsünüz. Hangi onun muhtemelen 3'e yakın ve yuvarlanır demektir. Eğer 3 istedim, kardeş işlevini hücrelerinin, kullanmak zorunda.

Açıkça () fonksiyonu ve / veya (bir int için döküm yerine tavanın dayanarak) yuvarlak kullanarak daha iyi sonuçlar alabilirsiniz. Daha fazla bilgi için buraya bakınız: http://php.net/manual/en/language.types.integer.php

Biraz performans pahasına, numarayı yuvarlama veya dize biçimlendirme tarafından daha yararlı bir dizi hassasiyet azaltarak, onu zorlamak olabilir:

echo floor(round(log10(238328)/log10(62), 4));
echo floor(sprintf('%.4f', log10(238328)/log10(62)));

// output:
// 3
// 3

Size ihtiyacınız minimum hassasiyet ile gitmeli. Daha hassas istediğini not olduğunu. Daha doğru olabilir döşeme olmadan Yuvarlama, sonuçları hassas bağlı olarak farklıdır.

echo floor(round(log10(238328)/log10(62), 16));
echo round(log10(238328)/log10(62), 16);
// output:
// 2
// 3

neredeyse aynı yapmak için orada üç fonksiyonları:

  • ceil -> ceil(0.2)==1 && ceil(0.8)==1
  • kat -> floor(0.2)==0 && floor(0.8)==0
  • yuvarlak -> round(0.2)==0 && round(0.8)==1