6

整数または浮動小数点数を含む変数があるとします (PHP では整数が浮動小数点数にオーバーフローする可能性があるため)。

一番左の数字と残りの数字を取得する操作を実行したいと思います。

よりよく説明するには:

<?php

$x   = NULL;  //this will hold first digit
$num = 12345; //int

/// run operation


//outputs
//$x   = 1;
//$num = 2345;
var_dump($x, $num);

?>

さて、数値を文字列として表す場合、これを行う方法はたくさんあることを知っていますが、文字列に型キャストすることは避けようとしています。

私はおそらくビット単位の操作を含むソリューションを探していますが、そのトピックにはかなり弱いので、通常は低レベルで作業する人がこれに答えられることを願っています!

本当にありがとう。

4

7 に答える 7

11

文字列にキャストせずにこれを行う方法があると確信していますが、なぜですか? 回り道はstringとても簡単です:

$x = (int)substr($num, 0, 1); 

素敵で適切な整数が得られます。

明らかに、これは誤った入力の拡張チェックを$num行わず、有効な数値である必要があります。

于 2010-07-05T13:23:07.393 に答える
9

文字列操作の使用を回避しますが、float または負の値の保証はありません

$x   = NULL;  //this will hold first digit
$num = 12345; //int

$m = 1;
while(true) {
    $m *= 10;
    if ($m > $num)
        break;
}

$m /= 10;

$x = (int) floor($num / $m);
$num = $num % $m;


//outputs
//$x   = 1;
//$num = 2345;
var_dump($x, $num);
于 2010-07-05T13:37:28.103 に答える
8

数学のみの方法:

function leftMost($num) {  
    return floor($num/pow(10,(floor((log10($num))))));
}

説明したと思います...

num の 1+ log10 は数値の桁数を計算します。小数の値を削除するために床を切り、指数として配置します。1 桁の数値の場合は 10^0=1、または 8 桁の数値の場合は 10 になります。 ^8. 次に、12345678/10000000 = 1.2345678 を割ります。

注: これは 0 と 1 の間の数値でも機能し、0.02 で 2 を返し、文字列変換は失敗します。

負の数を扱いたい場合は、最初に $num = abs($num) を作成します。

于 2010-07-05T13:47:43.963 に答える
0

残りの桁を取得するには

$ minimumnum =(int)substr((string)$ num、1、strlen($ num));

于 2010-07-05T13:28:48.020 に答える
0

値を文字列にタイプキャストする場合は、配列型セレクターを使用できます。

例えば:

$n = (string)12345676543.876543;
echo (int)$n[0];
于 2010-07-05T13:36:23.907 に答える
0

文字列へのキャストを避けたいとおっしゃっていましたが、PHP で数字をループしたい場合は、これが最速の方法です。

$len = strlen($n);
for ($i = 0; $i < $len; ++$i)
  $d = $n[$i];

log簡単なベンチマークでは、との呼び出しを最小限に抑えた場合でも、同等の数式セットよりも約 50% 高速でしたexp

于 2010-07-05T14:56:24.783 に答える
0

@Mark Ba​​ker は最適なソリューションを提供しましたがabs(floor($num))、アルゴリズムを適用する前に行う必要があります。

于 2010-07-05T13:43:13.843 に答える