質問

PHPで最も近い重要な人物に倒れる洗練された方法はありますか?

そう:

0->0
9->9
10->10
17->10
77->70
114->100
745->700
1200->1000

?

役に立ちましたか?

解決

$numbers = array(1, 9, 14, 53, 112, 725, 1001, 1200);
foreach($numbers as $number) {
    printf('%d => %d'
            , $number
            , $number - $number % pow(10, floor(log10($number)))
            );
    echo "\n";
}

残念ながら、$ numberが0の場合、これは恐ろしく失敗しますが、正の整数に対して期待される結果が生成されます。そして、それは数学のみのソリューションです。

他のヒント

これが純粋な数学の解決策です。また、これは、ダウンだけでなく、上下したいと思った場合でも、より柔軟なソリューションです。そしてそれは0で動作します:)

if($num === 0) return 0;
$digits = (int)(log10($num));
$num = (pow(10, $digits)) * floor($num/(pow(10, $digits)));

交換できます floorround また ceil. 。実際、最寄りに丸くしたい場合は、3行目をさらに簡素化できます。

$num = round($num, -$digits);

マシーソリューションが必要な場合は、これを試してみてください。

function floorToFirst($int) {
    if (0 === $int) return 0;

    $nearest = pow(10, floor(log($int, 10)));
    return floor($int / $nearest) * $nearest;
}

このようなもの:

$str = (string)$value;
echo (int)($str[0] . str_repeat('0', strlen($str) - 1));

それは完全に非耐性ですが、私は刺し傷の長さを利用してこれを行うだけです...おそらくそれを処理するためのより滑らかな方法がありますが、

function significant($number){
    $digits = count($number);
    if($digits >= 2){
        $newNumber = substr($number,0,1);
        $digits--;
        for($i = 0; $i < $digits; $i++){
            $newNumber = $newNumber . "0";
        }
    }
    return $newNumber;
}

数学ベースの代替手段:

$mod = pow(10, intval(round(log10($value) - 0.5))); 
$answer = ((int)($value / $mod)) * $mod;

私はこれが古いスレッドであることを知っていますが、この問題を解決する方法についてのインスピレーションを探しているときにそれを読みました。これが私が思いついたものです:

class Math
{
    public static function round($number, $numberOfSigFigs = 1)
    {
        // If the number is 0 return 0
        if ($number == 0) {
            return 0;
        }

        // Deal with negative numbers
        if ($number < 0) {
            $number = -$number;
            return -Math::sigFigRound($number, $numberOfSigFigs);
        }

        return Math::sigFigRound($number, $numberOfSigFigs);
    }

    private static function sigFigRound($number, $numberOfSigFigs)
    {
        // Log the number passed
        $log = log10($number);

        // Round $log down to determine the integer part of the log
        $logIntegerPart = floor($log);

        // Subtract the integer part from the log itself to determine the fractional part of the log
        $logFractionalPart = $log - $logIntegerPart;

        // Calculate the value of 10 raised to the power of $logFractionalPart
        $value = pow(10, $logFractionalPart);

        // Round $value to specified number of significant figures
        $value = round($value, $numberOfSigFigs - 1);

        // Return the correct value
        return $value * pow(10, $logIntegerPart); 
    }
}

ここの機能は機能しましたが、非常に少ない数字でかなりの数字が必要でした(価値の低い暗号通貨をビットコインと比較してください)。

での答え PHPの大幅な数字のフォーマット番号 非常に少数の数字が科学的表記でPHPによって表示されていましたが、やや働きましたが、一部の人々が読むのは難しくなります。

enter image description here

number_formatを使用しようとしましたが、小数点以降に特定の数字数の数字が必要であり、数の「重要な」部分(設定番号が入力されている場合)を破り、時には0(セット番号よりも小さい数字の場合)が返されます。

解決策は、関数を変更して非常に少ない数値を識別し、それらにnumber_formatを使用することでした - 科学表記数の数字の数をnumber_formatの数字の数として取得することでした。

function roundRate($rate, $digits)
{
    $mod = pow(10, intval(round(log10($rate))));
    $mod = $mod / pow(10, $digits);
    $answer = ((int)($rate / $mod)) * $mod;
    $small = strstr($answer,"-");
    if($small)
    {
        $answer = number_format($answer,str_replace("-","",$small));
    }
    return $answer;
}

この関数は、重要な数字を保持し、すべての人に読みやすい形式で数値を提示します。 (私は知っている、それは科学者にとっても最高でも、最も一貫した長さの「きれいな」数字でさえありませんが、それは全体的に私たちが必要とするものにとって最高の解決策です。)

enter image description here

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top