总是四舍五入到第一位小数

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() 的可选第二个参数是精度参数,它指定要四舍五入的小数位数。第三个可选参数指定舍入模式。详情见PHP manual for round

使用 round() 并不总是将 向上舍入 ,即使在使用 PHP_ROUND_HALF_UP 时也是如此(例如 9.00001 不会四舍五入为 9.1)。您可以尝试使用乘法 ceil() 和除法:

ceil($value * 10.0) / 10.0

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

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

我不是 php 程序员,所以必须在 "steps" 中回答。您遇到的问题是您有一个恰好一位小数的数字的边缘情况。 (例如 9.5)

您可以这样做:

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

对于步骤 (2),仔细查看 php 文档会发现一个函数 bool is_int ( mixed $var ) 用于测试整数。

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

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

使用这个:online test

你可以使用这个技巧。只需分解给定的数字/字符串,得到 . 的下一个值/数字的数字。得到这个之后你需要增加那个值并检查该值是否大于 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)