簡體   English   中英

php舍入值,尾隨2位小數,5位的倍數

[英]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.12.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM