2012-04-03 93 views
1

我需要在1到無窮大的整數之間取整到下一個有效數字(雖然在實踐中我不太可能需要向上舍入無窮大,所以很樂意解決合理內部限制),例如:舍入到下一個有效數字

$x <= 10 ? $x = 10 
10 < $x <= 100 ? $x = 100 
100 < $x <= 1000 ? $x = 1000 

回合/小區等似乎並沒有做的相當按計劃工作。 (?或功能)朝着正確algorhythm的指針將不勝感激

回答

1
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 
+0

非常感謝 - 這是我接受的答案,因爲它似乎是最直接的。 – 2012-04-03 10:10:59

+0

它不適用於某些值,包括'1':'echo my_ceil(1); // 1',但根據問題它必須是'10'。它也不處理無效的輸入,尤其是字符串和浮點數可能很容易使其無效。 – hakre 2012-04-03 10:34:53

+0

@hakre嗯..介意告訴我什麼其他值不起作用? – 2012-04-03 10:41:01

1

我認爲這是你在找什麼:

echo ceil($x/pow(10, strlen($x))) * pow(10, strlen($x)); 

只有當$x是一個整數的作品,但你說你的問題確實如此,所以沒有問題(除非您稍後嘗試使用包含小數的數字)。

4

我覺得這個方法解決您的問題:

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 
+0

有趣的解決方案。使用遞歸函數是否有開銷? – 2012-04-03 10:09:23

+2

@Christian Mayne:是的,遞歸有額外的函數調用每個遞歸的開銷。這個計算實際上不需要遞歸,一個變量已經完成了工作,所以迭代更可取。再次計算通常比迭代更可取 - 但並非總是可行(或不總是更快/更直接)。 – hakre 2012-04-03 10:35:48

2
$x = pow(10,floor(log10($x)) + (floor(log10($x)) == log10($x) && $x!=1 ? 0:1)); 
1

這應該做的伎倆:

<?php 
function nextSignificantFeature($number){ 
    $upper = pow(10, strlen($number)); 
    return $number == $upper/10 ? $number : $upper; 
} 
?> 
1

其實有在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那樣進行內聯。