2016-05-12 41 views
1

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

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

我该怎么做?

+0

关于[舍入](http://stackoverflow.com/q/12277945/3919155)的相似问题。 – jotik

回答

2

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

round($value, 1, PHP_ROUND_HALF_UP) 

可选的第二个参数是 round()精度参数,并将它指定舍入到小数的位数。第三个可选参数指定舍入模式。有关详细信息,请参见 PHP manual for round

使用round()不总是圆向上,使用PHP_ROUND_HALF_UP即使当(例如9.00001未舍入为9.1)。你可以改为尝试用乘法,ceil()和除法:

ceil($value * 10.0)/10.0 

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

+0

我已经使用过圆形,但当第三个(或更多)小数点低于5时,它总是向下舍入。我还查看了精度参数,但找不到任何有用的东西。 –

+0

我认为它不能像指定的那样工作。 'echo'9.00000001 =>'.round(9.00000001,1,PHP_ROUND_HALF_UP).PHP_EOL;'对于我输出的结果是9. –

+0

[This question](http://stackoverflow.com/q/36324171/3919155)也可能帮助你,但我编辑了我的答案(再次)为你的问题提供一个简单的替代解决方案。 – jotik

0

您将需要一个自定义的ceil()函数,您的需求不能通过默认函数或圆形来满足。

1

我不是一个PHP程序员,所以将不得不在“步骤”中回答。你遇到的问题就是边界情况,你有一个精确到一位小数的数字。 (如9.5)

这里是你如何能做到这一点:

  1. 乘你的电话号码由10
  2. 如果这是一个整数,然后再返回原来的号码(这是边缘的情况下),否则继续如下:
  3. 添加0.5
  4. 以正常方式取整(即“a.5”取整)。
  5. 10。

对于步骤(2)划分的结果,PHP文档周围嗅探揭示的功能bool is_int (mixed $var)来测试的整数。

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; 
} 
+0

这里的问题是9.91的结果应该是什么?我认为它应该是10。 –

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)