Değişken bir tamsayı ise PHP edin

7 Cevap php

Bu PHP kodu vardır:

$entityElementCount = (-($highScore-$totalKeywordCount))/0.29;

Ne ben bilmek istiyorum $entityElementCount bir tam sayı (2, 6, ...) veya kısmi (2.33, 6.2, ...) olup olmadığını kontrol etmek, nasıl olduğunu.

Teşekkür ederiz!

7 Cevap

Temel yolu, Chacha dedi gibi

if (floor($number) == $number)

Ancak, kayan nokta türleri doğru 1 0,999999997 olarak depolanıyor olabilir anlamına gelir numaralarını saklayamazsınız. Bu olacak tabii ki 0'a aşağı yuvarlanır olacak çünkü yukarıdaki çek bir tam sayı olarak kabul edilecek close enough 1 bile sizin amaçlı olsa da, başarısız olur yani. Dolayısıyla böyle bir şey deneyin:

if (abs($number - round($number)) < 0.0001)

Eğer şimdiye kadar "ten" veya "100", sadece {kullanabileceğiniz gibi, bir dize olarak döküm bir tamsayı olmayacaktır anlamı (sayısal olacağını biliyorsanız [(2) }]:

$entityElementCount = (-($highScore-$totalKeywordCount))/0.29;
$entityWholeNumber = is_int($entityElementCount);

echo ($entityWholeNumber) ? "Whole Number!" : "Not a whole number!";

Ben bu eski olduğunu biliyorum, ama ben sadece bir şey buldu, paylaşmak istedim:

fmod kullanın ve 0 kontrol

$entityElementCount = (-($highScore-$totalKeywordCount))/0.29;
if (fmod($entityElementCount,1) != 0) {
    echo 'Not a whole number!';
} else {
    echo 'A whole number!';
}

Eğer bir fraksiyon varsa,% benim için çalışmak gibi görünüyor (0 döndürür ... Örneğin, echo 9.4 % 1; çıktısı 0). değil çünkü fmod% farklıdır Fmod ile, kesir kısmını alırsınız. Örneğin:

echo fmod(9.4, 1);

Will çıkış 0.4

floor($entityElementCount) == $entityElementCount

Bu tam sayıdır, bu gerçek olacak

if(floor($number) == $number)

Istikrarlı bir algoritma değildir. Bir değer Matematiksel ifadeyle 1.0 olduğunda sayısal değeri 0,9999999 olabilir. Bunu kat () uygularsanız 0,9999999 eşittir olmadığı 0 olacaktır.

Örneğin 3 basamaklı bir hassas yarıçapı tahmin var

if(round($number,3) == round($number))

Bu gibi intval işlevini kullanın:

if($number === intval($number)) {

}

Testler:

var_dump(10 === intval(10));     // prints "bool(true)"
var_dump("10" === intval("10")); // prints "bool(false)"
var_dump(10.5 === intval(10.5)); // prints "bool(false)"
var_dump("0x539" === intval("0x539")); // prints "bool(false)"

Other solutions

1)

if(floor($number) == $number) {   // Currently most upvoted solution: 

Testler:

$number = true;
var_dump(floor($number) == $number); // prints "bool(true)" which is incorrect.

2)

if (is_numeric($number) && floor($number) == $number) {

Köşe durum:

$number = "0x539";
var_dump(is_numeric($number) && floor($number) == $number); // prints "bool(true)" which depend on context may or may not be what you want

3)

if (ctype_digit($number)) {

Testler:

var_dump(ctype_digit("0x539")); // prints "bool(false)"
var_dump(ctype_digit(10)); // prints "bool(false)"
var_dump(ctype_digit(0x53)); // prints "bool(false)"

Ne basit bir yaklaşım bir değer bütün olup olmadığını belirlemek için modül (%) kullanmak olacaktır gibi görünüyor.

x = y % 1  

Y bir tam sayı başka bir şey ise, sonuç sıfır değildir (0). Bir test sonra olacaktır:

if (y % 1 == 0) { 
   // this is a whole number  
} else { 
   // this is not a whole number 
}

var isWhole = (y % 1 == 0? true: false);  // to get a boolean return. 

Bu daha sonra sadece) etrafında y her zaman pozitif test etmek için (ABS sarın, bir tam sayı olarak negatif bir sayı görüntüler verildi.