php - 如何对 bcmath 数字进行上限、下限和四舍五入?

标签 php rounding floor bcmath ceil

我需要模仿 ceil() 的确切功能, floor()round() bcmath 数字上的函数I've already found a very similar question但不幸的是the answer provided isn't good enough for me因为它缺乏对负数的支持,并且 round() 函数的精度参数丢失

我想知道是否有人可以为这个问题想出一个相当简短而优雅的解决方案。

感谢所有输入,谢谢!

最佳答案

在尝试解决这个问题一夜之后,我相信我找到了一个相当简单的解决方案,这里是:

function bcceil($number)
{
    if (strpos($number, '.') !== false) {
        if (preg_match("~\.[0]+$~", $number)) {
            return bcround($number, 0);
        }
        
        if ($number[0] != '-') {
            return bcadd($number, 1, 0);
        }
        
        return bcsub($number, 0, 0);
    }
    return $number;
}

function bcfloor($number)
{
    if (strpos($number, '.') !== false) {
        if (preg_match("~\.[0]+$~", $number)) {
            return bcround($number, 0);
        }
        
        if ($number[0] != '-') {
            return bcadd($number, 0, 0);
        }
        
        return bcsub($number, 1, 0);
    }
    return $number;
}

function bcround($number, $precision = 0)
{
    if (strpos($number, '.') !== false) {
        if ($number[0] != '-') {
            return bcadd($number, '0.' . str_repeat('0', $precision) . '5', $precision);
        }
        
        return bcsub($number, '0.' . str_repeat('0', $precision) . '5', $precision);
    }
    
    return $number;
}

我想我没有错过任何东西,如果有人能发现任何错误,请告诉我。以下是一些测试:

assert(bcceil('4') == ceil('4')); // true
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') == floor('4')); // 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', 0) == number_format('3', 0)); // 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

关于php - 如何对 bcmath 数字进行上限、下限和四舍五入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1642614/

相关文章:

c++ - Floor,int 转换对于大值不能正常工作

php - SQL 查询将逗号分隔的字符串与逗号分隔的字符串进行匹配?

php - CDBCriteria 联接不返回所选的第二个和第三个表的数据

php - FILTER_VALIDATE_EMAIL 是否足以阻止 shell 注入(inject)?

c++ - 多重定义,不在标题中?为什么 floor 返回双倍?

C - 双模整数的下限

php - 按类别统计总数量

R. 四舍五入到特定位数。小数点无关

floating-point - Rust 可以在编译时设置浮点舍入模式吗?

ruby - 在 ruby 中四舍五入到 0.5 或 1