PHP 中没有截断函数 - 选项?

问题描述 投票:0回答: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 Floor() 函数:使用 PHP 截断浮点数

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

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

例如

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

如何将 0.87 截断为 0.86?这个不成立。有没有办法让它仅在小数点后两位以上时才截断?

php decimal truncate floor
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 的文档!


4
投票

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

floor(0.7666666667 * 100) / 100;

2
投票

如何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
  ?>

1
投票

要准确地对正数 负数执行此操作,您需要使用:

  • php

    floor()
    +ve 数字函数

  • php

    ceil()
    函数用于 -ve 数字

    函数 truncate_float($number, $decimals) { $power = pow(10, $decimals); if($数字 > 0){ 返回楼层($number * $power) / $power; } 别的 { 返回 ceil($number * $power) / $power; } }

这样做的原因是

floor()
总是将数字向下舍入,而不是向零舍入。
floor()
有效地将 -ve 数字舍入到更大的绝对值
例如
floor(1.5) = 1
floor(-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>';
?>

0
投票

我使用了 Kartikey 提到的 round() 函数。您可以在 PHP.Net

找到更多信息
float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )

© www.soinside.com 2019 - 2024. All rights reserved.