是否有任何库函数用于此目的,所以我不手动完成并冒险以TDWTF结束?
echo ceil(31497230840470473074370324734723042.6); // Expected result 31497230840470473074370324734723043 // Prints
Alix Axel.. 13
更新:在这里看到我的改进答案:如何cel,floor和round bcmath数字?.
这些功能似乎更有意义,至少对我来说:
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()函数的精度参数.
一些测试:
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
Greg.. 7
这对你有用:
$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); }
基本上它通过乘以零精度来找到浮标.
然后它可以通过从总计中减去,调用内置函数,然后重新添加结果来进行ceil/round
编辑:固定为-ve数字
更新:在这里看到我的改进答案:如何cel,floor和round bcmath数字?.
这些功能似乎更有意义,至少对我来说:
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()函数的精度参数.
一些测试:
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
这对你有用:
$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); }
基本上它通过乘以零精度来找到浮标.
然后它可以通过从总计中减去,调用内置函数,然后重新添加结果来进行ceil/round
编辑:固定为-ve数字