删除两个小数点后的数字,而不舍入该值TL;DR:完整答案(历史)“旧”正确答案:功能利用地板新正确答案

2022-08-30 10:00:41

我在php变量中有值,就像那样

$var='2.500000550';
echo $var

我想要的是删除2位数字后的所有小数点。

像现在变量的值将是

$var='2.50';
echo $var

请记住,此值来自 mysql databse

但是当我使用我得到圆形但我不需要圆形时,我只需要删除2个小数后的所有数字简单。round php function

我累了,很多其他选择都没有成功。flot()

谢谢


答案 1

TL;DR:

PHP原生函数bcdiv似乎准确地完成了所需的工作,并且正确地做到了。

简单地“截断”一个数字,其中2是要保留的小数位数(1是分母 - 将数字除以1可以简单地将原始数字截断为所需的小数位)bcdiv($var, 1, 2);

完整答案(历史)

事实证明,这比人们想象的更难以捉摸。

在这个答案(错误地)被投票后,我注意到即使是sprintf也会四舍五入。

我没有删除这个答案,而是把它变成对每个建议的解决方案的更有力的解释/讨论。

number_format - 不正确。(回合)
尝试使用数字格式

$var = number_format($var, 2, '.', '');  // Last two parameters are optional
echo $var;
// Outputs 2.50

如果您希望它是一个数字,则只需将类型转换为浮点数:

$var = (float)number_format($var, 2, '.', '');

注意:正如评论中指出的那样,这实际上确实使数字四舍五入

冲刺 - 不正确。(冲刺也回合)
如果不对数字进行四舍五入很重要,则根据下面的答案,使用sprintf

$var = sprintf("%01.2f", $var);

地板 - 不完全是!(地板四舍五入负数)

地板,通过一些数学计算,将接近做你想做的事情:

floor(2.56789 * 100) / 100; // 2.56

其中 100 表示所需的精度。如果您希望它达到三位数,那么:

floor(2.56789 * 1000) / 1000; // 2.567

但是,这有负数问题。负数仍然四舍五入,而不是截断:

floor(-2.56789 * 100) / 100; // -2.57

“旧”正确答案:功能利用地板

因此,一个完全健壮的解决方案需要一个功能:

function truncate_number( $number, $precision = 2) {
    // Zero causes issues, and no need to truncate
    if ( 0 == (int)$number ) {
        return $number;
    }
    // Are we negative?
    $negative = $number / abs($number);
    // Cast the number to a positive to solve rounding
    $number = abs($number);
    // Calculate precision number for dividing / multiplying
    $precision = pow(10, $precision);
    // Run the math, re-applying the negative value to ensure returns correctly negative / positive
    return floor( $number * $precision ) / $precision * $negative;
}

上述函数的结果:

echo truncate_number(2.56789, 1); // 2.5
echo truncate_number(2.56789);    // 2.56
echo truncate_number(2.56789, 3); // 2.567

echo truncate_number(-2.56789, 1); // -2.5
echo truncate_number(-2.56789);    // -2.56
echo truncate_number(-2.56789, 3); // -2.567

新正确答案

使用 PHP 原生函数 bcdiv

echo bcdiv(2.56789, 1, 1);  // 2.5
echo bcdiv(2.56789, 1, 2);  // 2.56
echo bcdiv(2.56789, 1, 3);  // 2.567
echo bcdiv(-2.56789, 1, 1); // -2.5
echo bcdiv(-2.56789, 1, 2); // -2.56
echo bcdiv(-2.56789, 1, 3); // -2.567

答案 2
floor(2.500000550 * 100) / 100;

这应该可以完成您的任务...


推荐