(PHP 4, PHP 5, PHP 7, PHP 8)
bcscale — Устанавливает или получает количество цифр после десятичной точки по умолчанию для функций модуля BCMath
Функция устанавливает количество знаков после десятичной точки по умолчанию для функций модуля BCMath, при вызове которых разрядность дробной части не указали явно.
Функция получает текущую разрядность дробной части.
scaleРазрядность дробной части, количество знаков после десятичной точки.
Функция возвращает старую разрядность дробной части, когда вызывается с целочисленным аргументом для установки нового значения разрядности, иначе возвращает текущее количество знаков после десятичной точки.
Функция выбрасывает ошибку ValueError , если значение аргумента scale
выходит за пределы допустимого диапазона.
| Версия | Описание |
|---|---|
| 8.0.0 |
Параметр scale теперь принимает значение null .
|
| 7.3.0 |
Функция bcscale() теперь возвращает текущую разрядность дробной части числа;
при вызове с аргументом для установки нового значения количества знаков после десятичной точки по умолчанию
функция теперь возвращает старое значение разрядности дробной части. Раньше параметр
scale был обязательным, а функция bcscale() возвращала только значение true .
|
Пример #1 Пример установки разрядности дробной части числа функцией bcscale()
<?php
// Установка количества знаков после десятичной точки по умолчанию : 3
bcscale(3);
echo bcdiv('105', '6.55957'); // 16.007
// То же самое без вызова функции bcscale()
echo bcdiv('105', '6.55957', 3); // 16.007
?>These functions DO NOT round off your values. No arbitrary precision libraries do it this way. It stops calculating after reaching scale of decimal places, which mean that your value is cut off after scale number of digits, not rounded. To do the rounding use something like this:
<?php
function bcround($number, $scale=0) {
$fix = "5";
for ($i=0;$i<$scale;$i++) $fix="0$fix";
$number = bcadd($number, "0.$fix", $scale+1);
return bcdiv($number, "1.0", $scale);
}
?>Executing bcsacle() will change the scale value of fpm.conf, not only the current process.Simple, easy way to remove excess trailing zeros using rtrim:
<php>
// $total is the result of a bcmath calculation
if ( strpos($total, '.') !== false ):
$total = rtrim($total, '0');
$total = rtrim($total, '.');
endif;
</php>edited bcround function with negative number support:
<?php
function bcround($number, $scale=0) {
if($scale < 0) $scale = 0;
$sign = '';
if(bccomp('0', $number, 64) == 1) $sign = '-';
$increment = $sign . '0.' . str_repeat('0', $scale) . '5';
$number = bcadd($number, $increment, $scale+1);
return bcadd($number, '0', $scale);
}
?>