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

u0sqgete  于 2023-11-16  发布在  PHP
关注(0)|答案(5)|浏览(121)

我有一个算法,可以执行以下计算:
1.((0.50 * 0)+ 7)/ 10 = 0.70
1.((0.70 * 10)+ 9)/ 20 = 0.80
1.((0.80 * 20)+ 7)/ 30 = 0.766666667->我希望将此值截断为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 dropping decimals without rounding up
PHP number_format()函数:Show a number to two decimal places
PHP floor()函数:Truncate float numbers with PHP

  • 有别的办法吗?
  • 是否有可能实现我想要的(截断到小数点后两位)与PHP?
    UPDATE - SOLVED好了,多亏了dkspeed和zneak,它现在可以工作了。我使用了floor()方法(我假设我过去做得不对)。* 然而,现在发生了以下情况:*

例如
(0.86* 30)+ 9)/ 40 = 0.87(应该),但在TRYST之后= 0.86
它是如何截断0.87到0.86的?这没有意义。有没有办法让它截断只有当有2个以上的小数位?

cyvaqqii

cyvaqqii1#

这里给出的所有答案都是数字的四分之一。这个功能对我很有效,我希望你也是。

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

rkue9o1l

rkue9o1l2#

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

floor(0.7666666667 * 100) / 100;

字符串

xggvc2p6

xggvc2p63#

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

字符串

vof42yt1

vof42yt14#

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

  • php floor()函数用于+ve数字
  • php ceil()函数用于-ve数字

函数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
因此,对于使用multiply by power, round, then divide by power的truncate方法:

  • 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>';
?>

字符串

qvtsj1bj

qvtsj1bj5#

我使用了Kartikey提到的round()函数。你可以在PHP.Net找到更多信息。

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

字符串
菲什

相关问题