5

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

  1. ( ( 0.50 * 0 ) + 7 ) / 10 = 0.70
  2. ( ( 0.70 * 10 ) + 9 ) / 20 = 0.80
  3. ( ( 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>';
}
4

5 回答 5

5

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

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的文档!

于 2013-10-01T19:20:21.893 回答
4

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

floor(0.7666666667 * 100) / 100;
于 2012-05-17T20:49:43.180 回答
2

回合()怎么样

  <?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
  ?>
于 2012-05-17T21:52:11.920 回答
1

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

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) = 1,而floor(-1.5) = 2

因此,对于使用 truncate 方法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>';
?>
于 2015-03-02T23:22:52.440 回答
0

我曾经使用过 Kartikey 提到的 round() 函数。您可以在PHP.Net上找到更多信息

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

于 2015-02-13T03:44:33.800 回答