PHP Round()不能正常工作


PHP Round() not working properly

我需要帮助。我正在这样做:

round($myvar,2);

我得到的号码是:9.77999999999999999€

与其他变量它工作得很好,任何想法如何解决这个问题?

我这样做了:

<?php echo round(9.7752,2);?>

我得到:9.77999999999999999

我相信这是php.ini中的东西,就像@MarkBaker说的…但是,我通过这样做来修复它:

<?php echo number_format($myvar,2);

我得到了我想要的。谢谢大家的帮助!

在round函数前加入空字符串,就像

$val = "" . round(9.597466245, 2);

我遇到的问题是(18.203,2)= 18.2,那么json_encode(…)= 18.199999999。所以我发现解决方案是json_encode(strval(round(18.203,2))) = 18.2它是

一些东西(可能是在一些第三方代码?)设置您的ini设置precision16

$php -a
php > echo ini_get("precision");
14 // default 
php > echo round(9.7752,2);
9.78
php > echo ini_set("precision", 16);
14
php > echo round(9.7752,2);
9.779999999999999

将结果用浮点数封装

floatval(round($myvar,2));

如果使用number_format必须加上后面的两个参数,否则更大的数字会出错:

number_format($myvar,2, '.', '');

告诉PHP使用"."作为小数分隔符,没有千位分隔符

虽然OP解决了他的问题,但我在搜索其他(但类似的)问题时看到了这个

如果你来这里有一个问题,PHP的round()函数行为不当(即round(1.4447, 2)将输出1.44而不是1.45),这是因为round看起来只是1小数点后的精度,这里有一个小的递归辅助函数,解决了这个问题:

function roundFloat($float, $neededPrecision, $startAt = 7)
{
    if ($neededPrecision < $startAt) {
        $startAt--;
        $newFloat = round($float, $startAt);
        return roundFloat($newFloat, $neededPrecision, $startAt);
    }
    return $float;
}

使用例子:

roundFloat(1.4447, 2, 5); // Returns 1.45

解释:

  • 在上面的例子中,它从小数点后5位(0)开始舍入,因为没有另外说明。
  • 您可以使用相同的方法调用roundFloat(1.4447, 2, 15)这样的函数给定浮点数1.4447的结果。
  • $startAt只定义了"舍入过程"或所需精度的起点。

注意:所有的编程语言都有精确写浮点数的问题(与二进制有关,谷歌更多信息)。

希望对大家有所帮助。

我有同样的问题和我的解决方法(为了不改变ini-file,可能会破坏其他东西):

$rounded = bcdiv($number, 1, 2);

结合@PabloCamara的回答和@LorienBrune的评论,这个解决方案对我有效:

function roundFixed($number, $decimalPlaces)
{
    return str_replace(',', '', number_format($number, $decimalPlaces));
}