[英]php round off value with trailing 2 decimals and multiples of 5
我試過這個功能
function roundUpToAny($n,$x=5) {
return (round($n)%$x === 0) ? round($n) : round(($n+$x/2)/$x)*$x;
}
echo roundUpToAny(4.52);
//這個節目5而不是4.55
echo roundUpToAny(5.1);
//這個節目5而不是5.10
我怎樣才能創造出這樣的功能
我認為以下功能可以滿足您的需求:
function roundUpToAny($n, $x=5, $sf=2) {
$scale = pow(10,$sf);
return number_format(round(ceil($n*$scale / $x), $sf) * $x / $scale, $sf);
}
第一個參數是要轉換的數字,第二個參數是“舍入因子”( $x
倍數 - 你在問題的標題中要求5
),第三個是小數點后的數字。
測試:
echo roundUpToAny(1.23, 5, 2) ."\n";
echo roundUpToAny(4.54, 5, 2) ."\n";
echo roundUpToAny(5.101, 5, 3) ."\n";
echo roundUpToAny(1.19, 5, 3) ."\n";
結果:
1.25
4.55
5.105
1.190
UPDATE
您在后續文件中指出,上述代碼對於1.1
和2.2
輸入失敗。 這樣做的原因是這些數字在雙精度上並不完全可以表示(雖然這可能聽起來很奇怪) 。 以下代碼通過創建一個舍入為整數的中間值(因此可以精確表示)來對此進行補償:
function roundUpToAny($n, $x=5, $sf=2) {
$scale = pow(10,$sf);
$temp = round($n * $scale, $sf); // get rid of small rounding errors
return number_format(round(ceil($temp / $x), $sf) * $x / $scale, $sf);
}
測試:
echo roundUpToAny(1.1, 5, 2) ."\n";
結果:
1.10
正如所料。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.