总是在小数点后第一位四舍五入


Always round up on first decimal

我希望变量的第一个小数总是四舍五入。例如:

9.66 goes to 9.7
9.55 goes to 9.6
9.51 goes to 9.6
9.00000001 goes to 9.1

我该怎么做?

使用具有可选精度和圆形参数的round(),例如:

round($value, 1, PHP_ROUND_HALF_UP)

round()的可选第二个参数是精度参数,它指定要舍入到的小数位数。第三个可选参数指定舍入模式。有关详细信息,请参阅round的PHP手册

使用round()并不总是向上取整,即使使用PHPROUND_HALF_up(例如9.00001不取整到9.1)也是如此。您可以尝试使用乘法、ceil()和除法:

ceil($value * 10.0) / 10.0

由于这些都是浮点值,您可能无法得到确切的结果。

我进行了两次测试,并用测试用例提出了以下答案

<?php
echo '9.66 (expected 9.7) => '.myRound(9.66).PHP_EOL;
echo '9.55 (expected 9.6) => '.myRound(9.55).PHP_EOL;
echo '9.51 (expected 9.6) => '.myRound(9.51).PHP_EOL;
echo '9.00000001 (expected 9.1) => '.myRound(9.00000001).PHP_EOL;
echo '9.9 (expected ??) => '.myRound(9.9).PHP_EOL;
echo '9.91 (expected ??) => '.myRound(9.91).PHP_EOL;
function myRound($value)
{
    return ceil($value*10)/10;
}

我不是php程序员,所以必须按"步骤"回答。你遇到的问题是边的情况,你有一个恰好有一个小数的数字。(例如9.5)

以下是如何做到这一点:

  1. 把你的数字乘以10
  2. 如果这是一个整数,那么返回原始数字(这是边的情况),否则继续如下:
  3. 加0.5
  4. 按正常方式四舍五入为整数(即"a.5"向上取整)
  5. 将结果除以10

对于步骤(2),在php文档中探查会发现一个用于测试整数的函数bool is_int ( mixed $var )

您将需要一个自定义的ceil()函数,默认函数或循环都无法满足您的需求。

使用此:在线测试

你可以使用这个技巧。只需分解给定的数字/字符串,就可以得到.的下一个值/数字。得到这个值之后,你需要增加这个值,并检查这个值是否大于9或nor,如果,那么除以这个值,把进位加到主数字的第一部分。

$var = '9.96';
$ar = explode(".", $var);
$nxt = substr($ar[1], 0, 1) + 1;
if($nxt > 9){
    $tmp = (string) $nxt;
    $num = floatval(($ar[0] + $tmp[0]).".".$tmp[1]);
}   
else
    $num = floatval($ar[0].".".$nxt);
var_dump($num); // float(10)