将十进制数字截断到2位,但不应使用天花板或两层楼将其四舍五入


Cut off decimal numbers to 2 places but should NOT round it using ceil neither floor

我在PHP中遇到了一个涉及number_format的问题,我的代码看起来像这样,

number_format($my_number_with_decimal, 2, '.', ', ');

然而,如果我有一个像这个111.115这样的数字,它将转换为111.12,这不是我想要显示的,因为它显然对十进制数字进行了四舍五入。有没有一种变通方法,我可以将十进制数字限制为2,同时不会向上或向下取整?请帮忙。提前谢谢。

您想要的在逻辑上是不可能的:

 11.11 <= 11.115 <= 11.12

无论怎么看,将11.115截断为11.11都是四舍五入。

如果您只想保留前两位数字,只需执行:

floor($my_number_with_decimal * 100) / 100;

这相当于四舍五入。

您可以尝试floor()你可以有这个UDF:

function mine($num,$n=0){    //$n is number of decimal places
     return (floor($num*(pow(10,$n)))*pow(10,$n));
}

并称之为:mine(111.115,2);其应当返回CCD_ 8。

正如@Marc B所指出的,截断等于floor。因此,你可以使用简单的数学运算来计算特定数量的数字:

echo floor($input * 100) / 100;

请记住,floor是基于浮点值的,浮点值不是很精确。你可能会在vera大数字上得到奇怪的结果。bc函数族可以进行浮点运算,而不会出现舍入或地板问题!

http://php.net/manual/en/function.floor.php


这是一个使用bc函数的floor函数。如果地板有问题,可以试试。

function floor($number, $prec = 0) {
    $number = $number * pow(10,$prec);
    $number = bcdiv($number, pow(10,$prec), $prec);
    return $number;
}

http://php.net/manual/en/function.bcdiv.php

你知道有多少个整数吗?假设你这样做了,你可以通过切片来切断它。例如,用整数格式的数字:

$numberWithDecimal = (string)$numberWithDecimal;
$numberWithDecimal = substr($numberWithDecimal, 0, 5);
$numberWithDecimal = (int)$numberWithDecimal;

如果数字已经是字符串格式,您可以执行以下操作:

$numberWithDecimal = substr($numberWithDecimal, 0, 5);

这可能不是最好或最干净的,也没有经过测试,但我希望我能帮上忙。

丑陋的方式:

$number = 111.115;
preg_match('/([^.]*'.'d{0,2})/', $number, $match);
echo number_format($match[1], 2, '.', ',');