始终在第一个小数上舍入

时间:2016-05-12 07:49:00

标签: php rounding

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

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

我该怎么做?

5 个答案:

答案 0 :(得分:2)

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

round($value, 1, PHP_ROUND_HALF_UP)

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

即使使用PHP_ROUND_HALF_UP(例如9.00001未舍入到9.1),使用round()并不总是围绕向上。您可以尝试使用乘法,ceil()和除法:

ceil($value * 10.0) / 10.0

由于这些是浮点值,因此可能无法获得准确的结果。

答案 1 :(得分:1)

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

以下是如何做到的:

  1. 将您的号码乘以10。
  2. 如果这是一个整数,则返回原始数字(即边缘情况),否则继续如下:
  3. 加0.5
  4. 以正常方式将整数转换为整数(即​​" a.5"向上舍入)。
  5. 将结果除以10。
  6. 对于步骤(2),浏览php文档会显示一个函数bool is_int ( mixed $var )以测试整数。

答案 2 :(得分:1)

我做了几个测试,并建议以下测试用例的答案

<?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;
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

使用此:online test

您可以使用此技术。只需展开给定的数字/字符串,获取.的下一个值/数字的数字。在得到这个之后你需要递增该值并检查该值是否大于9或者是否,如果然后除以该值并将进位加到主数的第一部分。

$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)