2011-04-29 40 views

回答

7
$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

是的,這也可以工作:http://ideone.com/zHFqR – Kzqai 2011-04-29 16:50:46

1

事情是這樣的:

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

哎喲,這是調皮。在這裏,我認爲我將不得不學習一些數學。 – Kzqai 2011-04-29 16:23:25

+0

檢查它,並工作太:http://ideone.com/BVgSV – Kzqai 2011-04-29 16:57:31

+1

-1使用字符串作爲基本數學的替代品是從來沒有正確的想法 – 2011-04-29 17:14:38

3

如果你想有一個mathy解決方案,試試這個:

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

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

http://ideone.com/2DVGX也適用。 – Kzqai 2011-04-29 16:54:31

1

這是完全不mathy,但我只想做這個利用刺長度...有可能是一種更平滑的方式來處理它,但你可以用它來實現它

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; 
} 
4

這是一個純粹的數學解決方案。這也是一個更靈活的解決方案,如果你想要向上或向下舍入,而不只是向下。它適用於0 :)

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

你可以用roundceil更換floor。實際上,如果你想繞到最近,你可以更簡化第三條線。

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

在處理零時,除了零分警告以外,還可以工作。 – Kzqai 2011-04-29 17:01:35

+0

對,我以爲我通過0避免了除法,但我忘記了0的日誌。 – andrewtweber 2011-04-29 17:06:36

1

數學基礎的選擇:

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

我知道這是一個古老的線程,但對如何解決這個問題尋找靈感,當我讀它。以下是我想出了:

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); 
    } 
} 
0

雖然在這裏工作的功能,我需要顯著位數非常小的數字(比較低價值cryptocurrency到比特幣)。

Format number to N significant digits in 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

相關問題