删除两个小数点后的数字,而不对该值进行舍入

air*_*air 42 php function rounding

我有像这样的PHP变量的价值

$var='2.500000550';
echo $var
Run Code Online (Sandbox Code Playgroud)

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

就像现在的变量值一样

$var='2.50';
echo $var
Run Code Online (Sandbox Code Playgroud)

请记住,这个值来自mysql数据库

但是当我使用round php function我得到了圆但我不需要圆,我只需要删除2十进制简单后的所有数字.

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

谢谢

ran*_*ame 102

TL; DR:

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
Run Code Online (Sandbox Code Playgroud)

如果你想要它是一个数字,那么只需输入到一个浮点数:

$var = (float)number_format($var, 2, '.', '');
Run Code Online (Sandbox Code Playgroud)

注意:正如评论中指出的那样,事实上这确实围绕着数字.

sprintf - 不正确.(sprintf也是轮次)
如果没有舍入数字很重要,那么根据下面的答案,使用sprintf:

$var = sprintf("%01.2f", $var);
Run Code Online (Sandbox Code Playgroud)

地板 - 不太好!(楼轮负数)

一些数学的地板将接近你想做的事情:

floor(2.56789 * 100) / 100; // 2.56
Run Code Online (Sandbox Code Playgroud)

其中100表示​​您想要的精度.如果你想要三位数,那么:

floor(2.56789 * 1000) / 1000; // 2.567
Run Code Online (Sandbox Code Playgroud)

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

floor(-2.56789 * 100) / 100; // -2.57
Run Code Online (Sandbox Code Playgroud)

"老"正确答案:利用楼层的功能

因此,完全可靠的解决方案需要一个功能

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;
}
Run Code Online (Sandbox Code Playgroud)

以上功能的结果:

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
Run Code Online (Sandbox Code Playgroud)

新的正确答案

使用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
Run Code Online (Sandbox Code Playgroud)

  • 也许应该提到 number_format 返回一个字符串而不是一个数字。 (2认同)
  • @Bill_VA - 感谢您的评论.实际上,我的代码是正确的(和你的一样),并且我的代码遵循已知的[防御性]编码模式[Yoda Conditions](https://en.wikipedia.org/wiki/Yoda_conditions).如果你在_your_代码中忘记了一个`=`符号,你会无意中将`0`赋值给`$ number`变量.如果您忘记了_my_代码中的一个`=`符号,则会出现错误,并且PHP将无法运行. (2认同)

Suj*_*wal 9

floor(2.500000550 * 100) / 100;
Run Code Online (Sandbox Code Playgroud)

这应该做你的任务......

  • @Sepster - 实际上,这有一个舍入负数的问题.我已经改进了我的答案来解决这个问题. (2认同)

flu*_*flu 6

你正在请求一个返回"2.50"而不是返回的函数2.5,所以你不是在谈论算术而是字符串操作.那preg_replace你的朋友是:

$truncatedVar = preg_replace('/\.(\d{2}).*/', '.$1', $var);

// "2.500000050" -> "2.50", "2.509" -> "2.50", "-2.509" -> "2.50", "2.5" -> "2.5"
Run Code Online (Sandbox Code Playgroud)

如果你想用算术做,只需使用:

$truncatedVar = round($var * 100) / 100);

// "2.500000050" -> "2.5", "2.599" -> "2.59", "-2.599" -> "2.59"
Run Code Online (Sandbox Code Playgroud)


mat*_*ino 5

尝试使用number_format:

echo number_format('2.50000050', 2); // 2.50
Run Code Online (Sandbox Code Playgroud)

  • 这是轮次,然后截断.因此,如果输入数字是2.509,则上述将返回2.51,而不是2.50.所以不回答明确说明"不圆"的问题 (4认同)