用未知数字进行四舍五入


working with Unknown number for Round Down

我有一个带有十进制字段的表,我需要将其舍入。

下面是这个表的数据片段:

number
9.5
9.53
7.25
6.9
9.6
8.0
8.3
8.75
9.0
12.25
12.65
11.0

如果XXX.0和XXX.5之间的数字需要四舍五入到XXX.0(如。8.3或12.25期望8.0或12.0)

如果号码在XXX.5和XXX.0之间,则需要四舍五入到XXX.5(如。9.53或9.6期待9.5或9.5)

否则数字保持不变(如。8.0或11.0)

我的问题是:我怎么定义小数点前面的数,它可以是0到20之间的任何数?我在任何地方都没有发现类似的东西……是否有一种方法可以只查看小数点后的值?

下面是一个截短的示例代码,其中XXX是十进制数的未知部分:

if(($number > XXX.0) && ($number < XXX.5))
    { $newNumber = round($number, 0, PHP_ROUND_HALF_DOWN); }
elseif(($number > XXX.5) && ($number < XXX.0))
    { $newNumber = round($number, 0, PHP_ROUND_HALF_DOWN); }
elseif(($number == XXX.5) || ($number == XXX.0))
    { $newNumber = $number; }

您可以使用fmod返回浮点余数,然后执行简单的三进制来输出您想要的结果。

<?php
$n = array(
8.3, //8.0
12.25, //12.00
9.53, //9.5
9.6 //9.5
);
foreach($n as $i) {
   echo $i .' = '. (fmod($i, 1) > 0.5 
           ? sprintf("%2.f", (float) (int) $i + 0.5) 
           : sprintf("%2.f", (float) (int) $i)) . PHP_EOL; 
}
https://eval.in/411076

和函数形式;

function round_mid($i) {
   return (fmod($i, 1) > 0.5 
             ? sprintf("%2.f", (float) (int) $i + 0.5) 
             : sprintf("%2.f", (float) (int) $i));
}
https://eval.in/411080

就像这样转换$number$beforeDecimal = (int)$number;

$newNumber = floor($number) + 0.5 * (fmod($number, 1) >= 0.5);

$newNumber = floor($number*2)/2