5

次の計算があります。

$this->count = float(44.28)
$multiple = float(0.36)
$calc = $this->count / $multiple;
$calc = 44.28 / 0.36 = 123

$calcここで、変数が整数 (小数がある) かどうかを確認したいと思います。

やってみましたがうまくいきif(is_int()) {}ません$calc = (float)123

これも試してみました-

if($calc == round($calc)) 
{ 
   die('is integer');
} 
else 
{
   die('is float);
}

ただし、すべての場合に返されるため、これも機能しません'is float'。上記の場合、123 は丸め後の 123 と同じであるため、これは当てはまりません。

4

10 に答える 10

9

試す-

if ((string)(int) $calc === (string)$calc) {
  //it is an integer
}else{
  //it is a float
}

デモ

于 2014-03-24T11:02:12.277 に答える
3

CodeBird が質問へのコメントで指摘したように、浮動小数点は精度の「エラー」により予期しない動作を示す可能性があります。

例えば

<?php
$x = 1.4-0.5;
$z = 0.9;

echo $x, ' ', $z, ' ', $x==$z ? 'yes':'no';

私のマシンに印刷されます(win8、x64、ただしphpの32ビットビルド)

0.9 0.9 no

x / y * ya)この質問に関連し、b)明白な(十分に明白だと思います)(うまくいけば正しい)例を見つけるのにしばらく時間がかかりました。

繰り返しますが、これは 64 ビット Windows 8 の 32 ビット ビルドでテストされています。

<?php
$y = 0.01; // some mambojambo here... 
for($i=1; $i<31; $i++) { // ... because ...
    $y += 0.01; // ... just writing ...
} // ... $y = 0.31000 didn't work

$x = 5.0 / $y;
$x *= $y;

echo 'x=', $x, "\r\n";
var_dump((int)$x==$x);

そして出力は

x=5
bool(false)

達成しようとしていることに応じて、値が整数の特定の範囲内にあるかどうかを確認する必要がある場合があります (または、スペクトルの反対側の限界値にすぎない可能性があります;-) )。

function is_intval($x, $epsilon = 0.00001) {
    $x = abs($x - round($x));
    return $x < $epsilon;
};

また、「精度のスケール」を設定できるbcmath 拡張機能など、任意の精度ライブラリを調べることもできます。

于 2014-03-24T11:52:29.107 に答える
1

round()float を返します。これは、小数点以下の桁数を設定できるためです。

正規表現を使用できます:

if(preg_match('~^[0-9]+$~', $calc))

PHP は、$calcに渡すときに自動的に文字列に変換しますpreg_match()

于 2014-03-24T11:00:47.493 に答える
1

を使用number_format()して数値を正しい形式に変換し、次のように作業できます

$count = (float)(44.28);

$multiple = (float)(0.36);

$calc = $count / $multiple;
//$calc = 44.28 / 0.36 = 123

$calc = number_format($calc, 2, '.', '');

if(($calc) == round($calc))
die("is integer");
else
die("is not integer");

デモ

于 2014-03-24T11:42:35.190 に答える
1

を使用してそれを行うことができます((int) $var == $var)

$var = 9;
echo ((int) $var == $var) ? 'true' : 'false';
//Will print true;
$var = 9.6;
echo ((int) $var == $var) ? 'true' : 'false';
//Will print false;

基本的に、int値が$var等しいかどうかを確認します$var

于 2014-03-24T11:03:23.840 に答える
1

さて、私はパーティーにかなり遅れていると思いますが、これはモジュロ操作である fmod() を使用する代替手段です。2 つの変数の計算後に分数を保存し、それらが > 0 であるかどうかを確認します。これは、それが float であることを意味します。

<?php

  class booHoo{
     public function __construct($numberUno, $numberDos) {
        $this->numberUno= $numberUno;
        $this->numberDos= $numberDos;
     }

     public function compare() {
       $fraction = fmod($this->numberUno, $this->numberDos);
       if($fraction > 0) {
         echo 'is floating point';
       } else {
         echo 'is Integer';
       }
     }
   }

$check= new booHoo(5, 0.26);
$check->compare();

ここで評価

編集:リマインダーFmodは除算を使用して数値を比較します。ドキュメント全体はここにあります

于 2014-03-24T12:05:25.943 に答える
0

これを試して:

//$calc = 123;
$calc = 123.110;
if(ceil($calc) == $calc)
{
    die("is integer");
}
else
{
    die("is float");
}
于 2014-03-24T11:15:23.187 に答える
0
if (empty($calc - (int)$calc))
{
    return true; // is int
}else{
    return false; // is no int
}
于 2014-03-24T11:05:35.657 に答える
0

浮動小数点数が整数でもあるかどうかを確認する、より非正統的な方法は次のとおりです。

// ctype returns bool from a string and that is why use strval
$result = ctype_digit(strval($float));
于 2015-10-31T18:38:37.903 に答える
0

is_int()関数の場所で関数を使用することができますround()

if(is_int($calc)) { 
die('is integer');
} else {
die('is float);
}

私はそれがあなたを助けると思います

于 2014-03-24T11:20:59.217 に答える