我想通过使用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
我尝试使用字符串将其拆分并手动添加,但不是一个很好的解决方案,希望在这里可以找到解决它的人。
答案 0 :(得分:14)
使用此功能
function rndfunc($x){
return round($x * 2, 1) / 2;
}
答案 1 :(得分:5)
从概念上讲,程序可以完成:
答案 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()