Обрезать числа с плавающей запятой с помощью PHP - PullRequest
11 голосов
/ 12 января 2011

Когда число с плавающей запятой необходимо усечь до определенной цифры после числа с плавающей запятой, оказывается, что это сделать нелегко.Например, если усечение должно быть выполнено до второй цифры после точки, цифры должны быть

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

Ответы [ 11 ]

0 голосов
/ 10 октября 2016

Я хотел бы добавить свой вклад в этот ответ с помощью функции, которую я использую для своих нужд, которая учитывает усеченные позиции как для отрицательных, так и для положительных значений.

function truncate($val,$p = 0)
{
  $strpos = strpos($val, '.');
  return $p < 0 ? round($val,$p) : ($strpos ? (float)substr($val,0,$strpos+1+$p) : $val);
}

... Я думаю, что это просто и быстро в использовании.

...