当前位置: 首页 > 面试题库 >

删除两位小数点后的数字,而不舍入该值

汪安然
2023-03-14
问题内容

我在php变量中有这样的价值

$var='2.500000550';
echo $var

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

像现在变量的值将是

$var='2.50';
echo $var

请记住,此值来自mysql databse

但是,当我使用round php function四舍五入但不需要四舍五入时,我只需要删除2位小数后的所有数字即可。

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

谢谢


问题答案:

PHP本机函数bcdiv似乎可以正确地正确执行所需的操作。

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

完整答案(历史记录)

事实证明,这比人们想象的要难得多。

在这个答案被(错误地)提高了很多之后,我注意到甚至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-错误。 (sprintf也会四舍五入)
如果不舍入数字很重要,则根据以下答案,使用sprintf:

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

地板-不完全是! (底数为负数)

有一些数学知识的floor几乎可以完成您想要的事情:

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


 类似资料:
  • 我如何四舍五入到两个小数位?

  • 我想把54.5345四舍五入到54.54,也就是说,如果我有第三个小数位,那么我想在第二个小数位上加1。 我试过用math.round但如果第三小数小于5,它总是四舍五入

  • 问题内容: 如果值为,则应将其格式化为。如果是,那么应该是。 问题答案: 这是一个实用程序,可以将双精度舍入(而不是截断)双精度至小数位数。 例如: 原始版本;提防这个 这在小数位数很高(例如)或整数部分很大(例如)的极端情况下会严重崩溃。感谢Sloin指出这一点。 多年来,我一直在使用上面的方法将“不太大”的双精度取整到2或3个小数位(例如,以秒为单位的清理时间用于记录目的:27.9876543

  • 我需要将PHP中的一个小数点舍入为两位小数,以便: 变成。。。 我尝试了数字_格式,但这只是将值舍入到49.96。我不能使用substr,因为数字可能更小(如7.950)。到目前为止,我还没有找到这个问题的答案。 非常感谢您的帮助。

  • 问题内容: 在Java中,我试图找到一种有效的方法来根据条件将BigDecimal舍入为两位小数,即Up或Down。 最有效的方法是什么? 问题答案:

  • 问题内容: 假设我的值为15.7784514,我想不进行四舍五入地显示为15.77。 结果是 - 如何显示15.77? 问题答案: 将数字转换为字符串,将数字匹配到小数点后第二位: 该方法在某些情况下(与)不同而失败,因此请务必小心。