是否有任何庫功能用於此目的,所以我不會手動完成並且以TDWTF結束風險?如何在PHP中循環/ ceil /創建一個bcmath數字?
echo ceil(31497230840470473074370324734723042.6);
// Expected result
31497230840470473074370324734723043
// Prints
<garbage>
是否有任何庫功能用於此目的,所以我不會手動完成並且以TDWTF結束風險?如何在PHP中循環/ ceil /創建一個bcmath數字?
echo ceil(31497230840470473074370324734723042.6);
// Expected result
31497230840470473074370324734723043
// Prints
<garbage>
這會爲你工作:
$x = '31497230840470473074370324734723042.9';
bcscale(100);
var_dump(bcFloor($x));
var_dump(bcCeil($x));
var_dump(bcRound($x));
function bcFloor($x)
{
$result = bcmul($x, '1', 0);
if ((bccomp($result, '0', 0) == -1) && bccomp($x, $result, 1))
$result = bcsub($result, 1, 0);
return $result;
}
function bcCeil($x)
{
$floor = bcFloor($x);
return bcadd($floor, ceil(bcsub($x, $floor)), 0);
}
function bcRound($x)
{
$floor = bcFloor($x);
return bcadd($floor, round(bcsub($x, $floor)), 0);
}
基本上,它由一個零精度乘法找到flooy。
然後,它可以通過減去從總,調用內置的功能,然後加入結果回到
編輯做小區/圓:固定-ve數字
+1 ,但可能值得向bcCeil和bcRound添加一個比例參數,因爲行爲取決於比例。如果你調用`bcscale(0)`然後嘗試bcCeil('1.1'),你會得到'1'而不是'2'。允許指定比例與其他BCMath功能一致。 – 2014-10-28 01:54:15
另外要注意的是,scale參數應該默認爲null,如果未提供,則不應覆蓋由「bcscale」設置的值。 – 2014-10-28 02:25:28
UPDATE:我見改進的答案在這裏:How to ceil, floor and round bcmath numbers?。
這些功能似乎更有意義,至少對我說:
function bcceil($number)
{
if ($number[0] != '-')
{
return bcadd($number, 1, 0);
}
return bcsub($number, 0, 0);
}
function bcfloor($number)
{
if ($number[0] != '-')
{
return bcadd($number, 0, 0);
}
return bcsub($number, 1, 0);
}
function bcround($number, $precision = 0)
{
if ($number[0] != '-')
{
return bcadd($number, '0.' . str_repeat('0', $precision) . '5', $precision);
}
return bcsub($number, '0.' . str_repeat('0', $precision) . '5', $precision);
}
他們支持負數,爲bcround()函數precision參數。
一些測試:
assert(bcceil('4.3') == ceil('4.3')); // true
assert(bcceil('9.999') == ceil('9.999')); // true
assert(bcceil('-3.14') == ceil('-3.14')); // true
assert(bcfloor('4.3') == floor('4.3')); // true
assert(bcfloor('9.999') == floor('9.999')); // true
assert(bcfloor('-3.14') == floor('-3.14')); // true
assert(bcround('3.4', 0) == number_format('3.4', 0)); // true
assert(bcround('3.5', 0) == number_format('3.5', 0)); // true
assert(bcround('3.6', 0) == number_format('3.6', 0)); // true
assert(bcround('1.95583', 2) == number_format('1.95583', 2)); // true
assert(bcround('5.045', 2) == number_format('5.045', 2)); // true
assert(bcround('5.055', 2) == number_format('5.055', 2)); // true
assert(bcround('9.999', 2) == number_format('9.999', 2)); // true
參見我的有關問題:http://stackoverflow.com/questions/1642614/how-to-ceil-floor-and-round-bcmath-numbers – 2009-10-29 10:02:15