当前位置: 首页 > 知识库问答 >
问题:

PHP如何舍入到小数点后两位?

范甫
2023-03-14

我需要将PHP中的一个小数点舍入为两位小数,以便:

49.955

变成。。。

49.95

我尝试了数字_格式,但这只是将值舍入到49.96。我不能使用substr,因为数字可能更小(如7.950)。到目前为止,我还没有找到这个问题的答案。

非常感谢您的帮助。

共有3个答案

段劲
2023-03-14

下面是一个很好的函数,它不使用字符串函数就可以实现这一点:

<?php
function floorp($val, $precision)
{
    $mult = pow(10, $precision); // Can be cached in lookup table        
    return floor($val * $mult) / $mult;
}

print floorp(49.955, 2);
?>

另一种选择是在四舍五入之前减去一个分数:

function floorp($val, $precision)
{
    $half = 0.5 / pow(10, $precision); // Can be cached in a lookup table
    return round($val - $half, $precision);
}
舒宏富
2023-03-14

不幸的是,之前的答案(包括已接受的答案)都不适用于所有可能的输入。

1)Sprintf('%1.').$精度.'f',$val)

精度为2:14.239的失败应返回14.23(但在本例中返回14.24)。

2) floatval(substr($val,0,strpos($val,,。)$precision 1))

精度为0时失败:14应返回14(但在本例中返回1)

3)substr($val,0, strrpos($val, '.', 0)(1$精度))

失败,精度为0:-1应返回-1(但在本例中返回“-”)

4)地板($val*pow(10,$精度))/pow(10,$精度)

虽然我广泛使用了这个,但我最近发现了它的一个缺陷;它在一些值上也失败了。精度为2:2.05应该返回2.05(但在这种情况下返回2.04!!)

不幸的是,到目前为止,通过所有测试的唯一方法是使用字符串操作。我基于rationalboss one的解决方案是:

function floorDec($val, $precision = 2) {
    if ($precision < 0) { $precision = 0; }
    $numPointPosition = intval(strpos($val, '.'));
    if ($numPointPosition === 0) { //$val is an integer
        return $val;
    }
    return floatval(substr($val, 0, $numPointPosition + $precision + 1));
}

此函数适用于正数和负数以及所需的任何精度。

冯宏恺
2023-03-14

这可以工作:floor($number*100)/100

 类似资料:
  • 问题内容: 我需要将PHP中的小数点四舍五入到小数点后两位,以便: 变成… 我已经尝试过 number_format ,但这只是将值 舍 入到 49.96 。我不能使用 substr, 因为该数字可能较小(例如7.950)。到目前为止,我一直无法找到答案。 任何帮助,不胜感激。 问题答案: 这可以工作:

  • 我如何四舍五入到两个小数位?

  • 我想把54.5345四舍五入到54.54,也就是说,如果我有第三个小数位,那么我想在第二个小数位上加1。 我试过用math.round但如果第三小数小于5,它总是四舍五入

  • 问题内容: 如果值为,则应将其格式化为。如果是,那么应该是。 问题答案: 这是一个实用程序,可以将双精度舍入(而不是截断)双精度至小数位数。 例如: 原始版本;提防这个 这在小数位数很高(例如)或整数部分很大(例如)的极端情况下会严重崩溃。感谢Sloin指出这一点。 多年来,我一直在使用上面的方法将“不太大”的双精度取整到2或3个小数位(例如,以秒为单位的清理时间用于记录目的:27.9876543

  • 问题内容: 在Java中,我试图找到一种有效的方法来根据条件将BigDecimal舍入为两位小数,即Up或Down。 最有效的方法是什么? 问题答案:

  • 我需要把分钟换算成小时,四舍五入到小数点后两位。我还需要在小数点后显示最多两个数字。所以如果我有650分钟,那么小时应该是10.83。 但在这种情况下,如果我的分钟数是630小时,那就是10.5000000。但我只想要10.50(四舍五入后)。我如何做到这一点?