有沒有什麼比較順利的方式來取整到最接近的有效數字?如何取整到最接近的有效數字在php
所以:
0->0
9->9
10->10
17->10
77->70
114->100
745->700
1200->1000
?
有沒有什麼比較順利的方式來取整到最接近的有效數字?如何取整到最接近的有效數字在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時,這會失敗,但它確實會產生正整數的預期結果。這是一個數學唯一的解決方案。
如果你想有一個mathy解決方案,試試這個:
function floorToFirst($int) {
if (0 === $int) return 0;
$nearest = pow(10, floor(log($int, 10)));
return floor($int/$nearest) * $nearest;
}
http://ideone.com/2DVGX也適用。 – Kzqai 2011-04-29 16:54:31
這是完全不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;
}
這是一個純粹的數學解決方案。這也是一個更靈活的解決方案,如果你想要向上或向下舍入,而不只是向下。它適用於0 :)
if($num === 0) return 0;
$digits = (int)(log10($num));
$num = (pow(10, $digits)) * floor($num/(pow(10, $digits)));
你可以用round
或ceil
更換floor
。實際上,如果你想繞到最近,你可以更簡化第三條線。
$num = round($num, -$digits);
在處理零時,除了零分警告以外,還可以工作。 – Kzqai 2011-04-29 17:01:35
對,我以爲我通過0避免了除法,但我忘記了0的日誌。 – andrewtweber 2011-04-29 17:06:36
數學基礎的選擇:
$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);
}
}
雖然在這裏工作的功能,我需要顯著位數非常小的數字(比較低價值cryptocurrency到比特幣)。
Format number to N significant digits in PHP的答案在某種程度上起作用,儘管PHP以科學記數法顯示了很小的數字,這使得它們很難被某些人閱讀。
我嘗試使用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;
}
此功能保留了顯著數字以及以易於閱讀的格式呈現給每個人的數字。(我知道,這是不是最好的科研人員甚至也不是最一致的長度「漂亮」看數字,但它的整體是我們所需要的最佳解決方案。)
是的,這也可以工作:http://ideone.com/zHFqR – Kzqai 2011-04-29 16:50:46