我需要在1到無窮大的整數之間取整到下一個有效數字(雖然在實踐中我不太可能需要向上舍入無窮大,所以很樂意解決合理內部限制),例如:舍入到下一個有效數字
$x <= 10 ? $x = 10
10 < $x <= 100 ? $x = 100
100 < $x <= 1000 ? $x = 1000
等
回合/小區等似乎並沒有做的相當按計劃工作。 (?或功能)朝着正確algorhythm的指針將不勝感激
我需要在1到無窮大的整數之間取整到下一個有效數字(雖然在實踐中我不太可能需要向上舍入無窮大,所以很樂意解決合理內部限制),例如:舍入到下一個有效數字
$x <= 10 ? $x = 10
10 < $x <= 100 ? $x = 100
100 < $x <= 1000 ? $x = 1000
等
回合/小區等似乎並沒有做的相當按計劃工作。 (?或功能)朝着正確algorhythm的指針將不勝感激
function my_ceil($in) {
if($in == 1) return $in;
if($in == pow(10, strlen($in)-1)) return $in;
return pow(10, strlen($in));
}
echo my_ceil(11); //100
echo my_ceil(10); //10
我認爲這是你在找什麼:
echo ceil($x/pow(10, strlen($x))) * pow(10, strlen($x));
只有當$x
是一個整數的作品,但你說你的問題確實如此,所以沒有問題(除非您稍後嘗試使用包含小數的數字)。
我覺得這個方法解決您的問題:
function n($nr, $p = 10) {
if($nr <= $p) {
return $p;
}
return n($nr, $p*10);
}
繼承人的結果:
echo n(1);
//output 10
echo n(232);
//output 1000
echo n(89289382);
//output 100000000
有趣的解決方案。使用遞歸函數是否有開銷? – 2012-04-03 10:09:23
@Christian Mayne:是的,遞歸有額外的函數調用每個遞歸的開銷。這個計算實際上不需要遞歸,一個變量已經完成了工作,所以迭代更可取。再次計算通常比迭代更可取 - 但並非總是可行(或不總是更快/更直接)。 – hakre 2012-04-03 10:35:48
$x = pow(10,floor(log10($x)) + (floor(log10($x)) == log10($x) && $x!=1 ? 0:1));
這應該做的伎倆:
<?php
function nextSignificantFeature($number){
$upper = pow(10, strlen($number));
return $number == $upper/10 ? $number : $upper;
}
?>
其實有在PHP的無窮數,所以實現應該處理它,你從1寫到任意數量到無窮Demo:
<?php
function n($number) {
if ($number < 1) {
throw new InvalidArgumentException('Number must be greater or equal 1.');
}
if ($number === INF) {
return INF;
}
$p = 10;
while($number > ($p*=10));
return $p;
}
echo n(1), "\n";
//output 10
echo n(232), "\n";
//output 1000
echo n(89289382), "\n";
//output 100000000
echo n(INF), "\n";
// output INF
echo n(-INF), "\n";
// throws exception 'InvalidArgumentException' with message 'Number must be greater or equal 1.'
這個例子確實在PHP用戶態代碼的迭代計算。 PHP中有一些數學函數可以像pow
那樣進行內聯。
非常感謝 - 這是我接受的答案,因爲它似乎是最直接的。 – 2012-04-03 10:10:59
它不適用於某些值,包括'1':'echo my_ceil(1); // 1',但根據問題它必須是'10'。它也不處理無效的輸入,尤其是字符串和浮點數可能很容易使其無效。 – hakre 2012-04-03 10:34:53
@hakre嗯..介意告訴我什麼其他值不起作用? – 2012-04-03 10:41:01