Когда число с плавающей запятой необходимо усечь до определенной цифры после числа с плавающей запятой, оказывается, что это сделать нелегко. Например, если усечение должно быть выполнено до второй цифры после точки, цифры должны быть
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 ) );
}