PHP 中没有截断函数 - 选项



我有一个执行以下计算的算法:

    ( (
  1. ( 0.50 * 0 ( + 7 (/10 = 0.70
  2. ( (
  3. ( 0.70 * 10 ( + 9 (/20 = 0.80
  4. ( (
  5. ( 0.80 * 20 ( + 7 (/30 = 0.7666666667 -> 我希望此值截断为 0.76

以便它可以作为以下方式输入到计算的其余部分:

4a. ( ( 0.76 * 30 ( + 8 (/40 = 0.77

并且四舍五入为0.77的小数点后两位时不要输入:

4b. ( (

( 0.77 * 30 ( + 8 (/40 = 0.77

**

**以下似乎失败了,而是强制四舍五入到 0.77:****

PHP

sptrinf(( 函数:PHP 删除小数而不向上舍入

PHP number_format(( 函数:PHP:显示一个数字到小数点后 2 位

PHP

floor(( 函数:使用 PHP 截断浮点数

  • 还有别的办法吗?
  • 是否有可能用 PHP 实现我想要的(截断到小数点后两位(?

请协助。非常感谢。

更新 - 已解决好的,由于 dkamins 和 zneak,它现在可以工作了。我使用了 floor(( 方法(我认为我过去没有做正确的事情(。但是,现在会发生以下情况:

例如

(0.86 * 30( + 9 (/40 = 0.87(应该(,但在TRUNC之后它= 0.86

它是如何将 0.87 截断为 0.86 的?这毫无意义。有没有办法让它仅在小数点后超过 2 位时才截断?

解决:

$numDecPlace = strlen(substr(strrchr($newRel, "."), 1));
echo '<p>Test: Number of decimal places=' .$numDecPlace. '</p>';
if($numDecPlace > 2) {
    $newRel = floor($newRel * 100) / 100; // Truncate to 2dp.
    echo '<p>Test: New relationship truncated is $newRel=' .$newRel. '</p>';
}

这里给出的所有答案都围绕着这个数字。这个功能对我有用,我希望你也一样。

function truncate($number, $decimals)
{
  $point_index = strrpos($number, '.'); 
  return substr($number, 0, $point_index + $decimals+ 1);
}

其中$number是要截断的数字,$decimals是所需的小数位数。例: truncate(-38.59540719940386 , 6);返回 -38.595407

如果需要,请查看 substr 的文档!

您可以使用 PHP 的 floor 函数以及一些十进制移位,如下所示:

floor(0.7666666667 * 100) / 100;

round(( 怎么样

  <?php
  echo round(3.4);         // 3
  echo round(3.5);         // 4
  echo round(3.6);         // 4
  echo round(3.6, 0);      // 4
  echo round(1.95583, 2);  // 1.96
  echo round(1241757, -3); // 1242000
  echo round(5.045, 2);    // 5.05
  echo round(5.055, 2);    // 5.06
  ?>

要准确地对 +ve -ve 数字执行此操作,您需要使用:
- +ve 数字
的 PHP floor()函数- -ve 数字的 PHP ceil()函数

function truncate_float($number, $decimals) {
    $power = pow(10, $decimals); 
    if($number > 0){
        return floor($number * $power) / $power; 
    } else {
        return ceil($number * $power) / $power; 
    }
}

这样做的原因是floor()总是将数字向下舍入,而不是朝零。
floor()有效地将 -ve 数字舍入为更大的绝对值
例如floor(1.5) = 1floor(-1.5) = 2

因此,对于使用 multiply by power, round, then divide by power 的截断方法:
- floor()仅适用于正数
- ceil()仅适用于负数

若要对此进行测试,请将以下代码复制到 http://phpfiddle.org/lite(或类似(的编辑器中:

<div>Php Truncate Function</div>
<br>
<?php
    function truncate_float($number, $places) {
        $power = pow(10, $places); 
        if($number > 0){
            return floor($number * $power) / $power; 
        } else {
            return ceil($number * $power) / $power; 
        }
    }
    // demo
    $lat = 52.4884;
    $lng = -1.88651;
    $lat_tr = truncate_float($lat, 3);
    $lng_tr = truncate_float($lng, 3);
    echo 'lat = ' . $lat . '<br>';
    echo 'lat truncated = ' . $lat_tr . '<br>';
    echo 'lat = ' . $lng . '<br>';
    echo 'lat truncated = ' . $lng_tr . '<br><br>';
    // demo of floor() on negatives
    echo 'floor (1.5) = ' . floor(1.5) . '<br>';
    echo 'floor (-1.5) = ' . floor(-1.5) . '<br>';
?>

我使用的将使用Kartikey提到的round((函数。您可以在此处找到更多信息 PHP.Net

float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )

菲什

相关内容

  • 没有找到相关文章

最新更新