(PHP 4, PHP 5, PHP 7, PHP 8)
bcscale — 设置/获取所有 bc math 函数的默认小数点保留位数
设置所有 bc math 函数在未设定情况下的小数点保留位数。
获取当前的小数点保留位数。
scale小数点保留位数。
设置的时候,返回之前的小数点保留位数。否则就是返回当前的位数。
如果 scale 超出有效范围,函数抛出 ValueError 。
| 版本 | 说明 |
|---|---|
| 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);
}
?>