我有一个执行以下计算的算法:
- ( (
- ( 0.50 * 0 ( + 7 (/10 = 0.70 ( (
- ( 0.70 * 10 ( + 9 (/20 = 0.80 ( (
- ( 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:****
PHPsptrinf(( 函数:PHP 删除小数而不向上舍入
PHP number_format(( 函数:PHP:显示一个数字到小数点后 2 位
PHPfloor(( 函数:使用 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) = 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>';
?>
我使用的将使用Kartikey提到的round((函数。您可以在此处找到更多信息 PHP.Net
float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )
菲什