2016-05-12 42 views
1

我希望我的變量的第一個小數總是四捨五入。例如:第一個小數總是舍入

9.66 goes to 9.7 
9.55 goes to 9.6 
9.51 goes to 9.6 
9.00000001 goes to 9.1 

我該怎麼做?

+0

關於[舍入](http://stackoverflow.com/q/12277945/3919155)的相似問題。 – jotik

回答

2

使用 round()具有任選的精度和圓類型參數,例如:

round($value, 1, PHP_ROUND_HALF_UP) 

可選的第二個參數是 round()精度參數,並將它指定舍入到小數的位數。第三個可選參數指定舍入模式。有關詳細信息,請參見 PHP manual for round

使用round()不總是圓向上,使用PHP_ROUND_HALF_UP即使當(例如9.00001未舍入爲9.1)。你可以改爲嘗試用乘法,ceil()和除法:

ceil($value * 10.0)/10.0 

由於這些都是浮點值,你可能無法得到精確的結果。

+0

我已經使用過圓形,但當第三個(或更多)小數點低於5時,它總是向下舍入。我還查看了精度參數,但找不到任何有用的東西。 –

+0

我認爲它不能像指定的那樣工作。 'echo'9.00000001 =>'.round(9.00000001,1,PHP_ROUND_HALF_UP).PHP_EOL;'對於我輸出的結果是9. –

+0

[This question](http://stackoverflow.com/q/36324171/3919155)也可能幫助你,但我編輯了我的答案(再次)爲你的問題提供一個簡單的替代解決方案。 – jotik

0

您將需要一個自定義的ceil()函數,您的需求不能通過默認函數或圓形來滿足。

1

我不是一個PHP程序員,所以將不得不在「步驟」中回答。你遇到的問題就是邊界情況,你有一個精確到一位小數的數字。 (如9.5)

這裏是你如何能做到這一點:

  1. 乘你的電話號碼由10
  2. 如果這是一個整數,然後再返回原來的號碼(這是邊緣的情況下),否則繼續如下:
  3. 添加0.5
  4. 以正常方式取整(即「a.5」取整)。
  5. 10。

對於步驟(2)劃分的結果,PHP文檔周圍嗅探揭示的功能bool is_int (mixed $var)來測試的整數。

1

我做了幾個測試,並提出如下回答測試用例

<?php 

echo '9.66 (expected 9.7) => '.myRound(9.66).PHP_EOL; 
echo '9.55 (expected 9.6) => '.myRound(9.55).PHP_EOL; 
echo '9.51 (expected 9.6) => '.myRound(9.51).PHP_EOL; 
echo '9.00000001 (expected 9.1) => '.myRound(9.00000001).PHP_EOL; 
echo '9.9 (expected ??) => '.myRound(9.9).PHP_EOL; 
echo '9.91 (expected ??) => '.myRound(9.91).PHP_EOL; 

function myRound($value) 
{ 
    return ceil($value*10)/10; 
} 
+0

這裏的問題是9.91的結果應該是什麼?我認爲它應該是10。 –

0

使用此:online test

您可以使用此技術。只需爆炸給定的數字/字符串,即可得到.的下一個值/數字的數字。得到這個之後,你需要增加這個值並檢查這個值是否大於9或者是否,如果然後除以該值並且將該進位加到主數字的第一部分。

$var = '9.96'; 
$ar = explode(".", $var); 

$nxt = substr($ar[1], 0, 1) + 1; 

if($nxt > 9){ 
    $tmp = (string) $nxt; 
    $num = floatval(($ar[0] + $tmp[0]).".".$tmp[1]); 
} 
else 
    $num = floatval($ar[0].".".$nxt); 

var_dump($num); // float(10)