舍入机制最接近0.05

时间:2009-10-20 03:56:16

标签: php rounding

我想通过使用php4,5.2及以下(不是5.3)来解决舍入机制 目前我正在进行0.05舍入,类似这样的页面:

http://www.bnm.gov.my/index.php?ch=209&pg=657&ac=568

before rounding | after rounding

          89.90 | 89.90

          89.91 | 89.90

          89.92 | 89.90

          89.93 | 89.95

          89.94 | 89.95

          89.95 | 89.95

          89.96 | 89.95

          89.97 | 89.95

          89.98 | 90.00

          89.99 | 90.00

我尝试使用字符串将其拆分并手动添加,但不是一个很好的解决方案,希望在这里可以找到解决它的人。

11 个答案:

答案 0 :(得分:14)

使用此功能

function rndfunc($x){
  return round($x * 2, 1) / 2;
}

答案 1 :(得分:5)

从概念上讲,程序可以完成:

  1. 除以0.05
    • 或乘以(1 / 0.05)
  2. 舍入到最接近的整数
  3. 乘以0.05

答案 2 :(得分:1)

您基本上想要将值映射到网格。网格定义为a multiple of .05。通常,您需要找到您的值之间的被乘数。

表中的不是是负数。您需要决定是否从零(对称)或始终在同一方向(即正)舍入。

代码:

$step = .05;
$multiplicand = floor( $value / $step );
$rest = $value % $step ;
if( $rest > $step/2 ) $multiplicand++; // round up if needed
$roundedvalue = $step*$multiplicand;

答案 3 :(得分:0)

乘以2,然后再舍入,然后除以2。

答案 4 :(得分:0)

提示: -

$ input1 = 24.05;

$ things = abs($ input * 20); // 481“.05”s

$ tenpcnt = abs($ things / 10); // 48“.05”s

$ ouput = $ tenpcnt / 20;

echo $ ouput; // 2.40

答案 5 :(得分:0)

function round5Sen ($value) { 

    return number_format(round($value*20,0)/20,2,'.','');
} 

echo round5Sen(155.13);
echo "\n";
echo round5Sen(155.12);
echo "\n";
echo round5Sen(155.0);
echo "\n";
echo round5Sen(155.18);
echo "\n";

答案 6 :(得分:0)

我确信有更优雅的解决方案,但这似乎适合任务:

<?php

// setup test
$start_num = 89.90;
$iterations = 10;

// loop through test numbers
for ($i = 0; $i < $iterations; $i++) {
  nickleRound($start_num + (0.01 * $i));
  echo "\n\n";
}

//
function nickleRound($num) {
  $p = 0.05;
  echo "\n" . 'p= ' . $p;

  $num = round($num, 2);
  echo "\n" . 'num= ' . $num;

  $r = ($num / $p);
  echo "\n" . 'r= ' . $r;

  $r2 = ceil($r) - $r;  
  echo "\n" . 'r2= ' . $r2;

  $a = round($num, 1);
  if (($r2 > 0) && ($r2 < 0.5)) {
    $a = $a + 0.05; 
  }
  echo "\n" . 'a= ' . $a;
}

答案 7 :(得分:0)

在@xtofl上稍微扩展以允许更精确的步骤(此问题在技术上不需要)

    $step         = 0.0005;
    $multiplicand = floor($value / $step);
    $rest         = fmod($value, $step);

    $value = $step * $multiplicand;

    if ($rest > $step / 2) {
        $value += $step;
    }

答案 8 :(得分:0)

//Round to nearest 0.05
echo round ($number * 20, 0) / 20;

//Round Up to nearest 0.05
echo ceil ($number * 20) / 20;

//Round Down to nearest 0.05
echo floor ($number * 20) / 20;

答案 9 :(得分:0)

感谢@mauris解决我在马来西亚GST舍入机制问题上的解决方案。它也适用于SQL。

DECLARE @tempTable AS TABLE(Number Decimal(20,4));

INSERT INTO @tempTable VALUES(89.90),(89.91),(89.92),(89.93),(89.94),(89.95),(89.96),(89.97),(89.98),(89.99)

SELECT Number,round(Number * 2,1)/ 2 AS&#39; Rounded&#39;来自@tempTable

答案 10 :(得分:0)

PHP 具有用于 PHP 4、PHP 5、PHP 7、PHP 8 的函数 round()

https://www.php.net/manual/en/function.round.php