使用 PHP 截断浮点数

当浮点数需要被截断到浮点后的某个数字时,事实证明这并不容易做到。例如,如果截断必须对点后的第二位数字进行截断,则数字应为

45.8976 => 45.89, 0.0185 => 0.01

(点后的第二位数字不按点后的第三位数字舍入)。

函数如 、 、 将数字四舍五入并打印出来round()number_format()sprintf()

45.8976 => 45.90, 0.0185 => 0.02

我遇到了两种解决方案,我想知道它们是否足够好,哪一种更好使用

1.

function truncNumber( $number, $prec = 2 )
{
    return bccomp( $number, 0, 10 ) == 0 ? $number : round( $number - pow( 0.1, bcadd(   $prec, 1 ) ) * 5, $prec );
}

2.

function truncNumber($number, $prec = 2 )
{
    return sprintf( "%.".$prec."f", floor( $number*pow( 10, $prec ) )/pow( 10, $prec ) );
}

答案 1

地板会按照你的要求做。

floor(45.8976 * 100) / 100;

你不会找到一个更直接的函数,因为这是一件奇怪的事情。通常,您将在数学上舍入正确。出于好奇 - 你需要这个做什么?


答案 2

这是我的解决方案:

/**
 * @example truncate(-1.49999, 2); // returns -1.49
 * @example truncate(.49999, 3); // returns 0.499
 * @param float $val
 * @param int f
 * @return float
 */
function truncate($val, $f="0")
{
    if(($p = strpos($val, '.')) !== false) {
        $val = floatval(substr($val, 0, $p + 1 + $f));
    }
    return $val;
}

推荐