PHP Round()无法正常工作

时间:2015-10-19 22:44:53

标签: php math

我需要帮助。我这样做:

round($myvar,2);

这是我得到的数字:9.779999999999999€

使用其他变量它可以正常工作,任何想法如何解决这个问题?

8 个答案:

答案 0 :(得分:10)

我这样做了:

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

我得到了:9.779999999999999

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

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

某些东西(可能在某些第三方代码中?)将您的ini设置从precision设置为16

$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

答案 3 :(得分:1)

我遇到的问题是圆形(18.203,2)= 18.2,然后是json_encode(...)= 18.199999999。 所以我发现解决方案是json_encode(strval(round(18.203,2)))= 18.2 它的工作原理

答案 4 :(得分:0)

虽然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只定义“舍入过程”的起点或所需的精度。

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

希望它有所帮助。

答案 5 :(得分:0)

我遇到了同样的问题和解决方法(为了不更改ini文件并可能破坏其他内容):

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

只需将结果封装在 floatval 中

floatval(round($myvar,2));

如果使用 number_format,则必须添加接下来的两个参数,否则较大的数字会出错:

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

这告诉 PHP 使用“.”作为小数点分隔符,没有千位分隔符。

相关问题