PHP number_format是四舍五入的?

时间:2011-05-22 11:31:30

标签: php rounding number-formatting

我的价格是“0,10”或“00000,10”

现在我试试

number_format($price, 2, ',', '')

我得到0,00。 我怎样才能解决这个问题?我想要0,10美元。 我不想舍入。

或者当我有5,678时,我得到5,68。但我想要5,67。

10 个答案:

答案 0 :(得分:7)

您可以在使用floor

进行四舍五入之前增加数字的大小
$price = floor($price * 100) / 100;
$formatted = number_format($price, 2, ',', '');

另一种解决方案,它可以提供更好的精度,因为它避免了浮点运算,是用三位小数格式化它并在格式化后丢弃最后一位数字:

$formatted = substr(number_format($price, 3, ',', ''), 0, -1);

答案 1 :(得分:6)

有几个人提到将它四舍五入到3然后删掉最后一个字符。这实际上不起作用。假设您有2.9999并将其四舍五入为3.它是3.000。

这仍然不准确,最好的解决方案是:

$price = '5.678';
$dec = 2;
$price = number_format(floor($price*pow(10,$dec))/pow(10,$dec),$dec);

这样做取价格乘以100(10 ^十进制)得到567.8,然后我们使用floor来得到它567,然后我们将它除以100得到5.67

答案 2 :(得分:4)

你应该在使用str_replace之前将逗号填充的数字转换回正常的小数。 $ number = str_replace(“,”,“。”,$ number); 然后你可以使用number_format

答案 3 :(得分:4)

"00000,10"是一个字符串。你应该小数点。要获得所需的行为,您可以使用:

echo substr(number_format(str_replace(',', '.', $price), 3, ',', ''), 0, -1);

答案 4 :(得分:2)

在执行number_format之前,字符串“0,10”由php转换为数字。因为php总是使用英语符号,所以它不会用逗号来表示。

echo "4 apples" + 2;  
output: 6

“apples”部分会被忽略,就像忽略“,10”一样。

将“,”转换为“。”允许php查看其他数字。

$price = str_replace(',', '.', '0,10');
number_format($price, 2, ',', '');

答案 5 :(得分:2)

我的问题是html验证器错误messege thar number_format()参数不是双倍。

我通过为number_format(floatval($var),2,'.',' ')之类的参数设置floatval来解决此错误消息,这样做效果很好。

答案 6 :(得分:1)

如果你只是想要清除前导零并且只是限制长度,而不是舍入到一定数量的小数位,则可以使用更通用的解决方案:

    function cutafter($string,$cutpoint,$length)
    {
        $temp = explode($cutpoint,$string);
        $int = $temp[0];
        $sub = $temp[1];
        return number_format($int,0).','.substr($sub,0,$length);
    }

示例:

    $number = "005,678";
    $answer = cutafter($number,",",2);

$ answer现在等于“5,67”

答案 7 :(得分:1)

使用此(需要激活的intl PHP扩展名)

$numberFmtCurrency = new NumberFormatter('de_AT', NumberFormatter::CURRENCY);
$numberFmtCurrency->setAttribute(NumberFormatter::ROUNDING_INCREMENT, 0);
$numberFmtCurrency->formatCurrency(328.13, 'EUR'); // prints € 328.13 (and not 328.15)

答案 8 :(得分:0)

function format_numeric($value) {

    if (is_numeric($value)) { // is number

        if (strstr($value, ".")) { // is decimal

            $tmp = explode(".", $value);
            $int = empty($tmp[0]) ? '0' : $tmp[0];
            $dec = $tmp[1];
            $value = number_format($int, 0) . "." . $dec;
            return $value;
        }

        $value =  number_format($value);
        return $value;
    }

    return $value; // is string
}

Unit Testing:

Passed / 1100000 => 1,100,000
Passed / ".9987" => .9987
Passed / 1100.22 => 1,100.22
Passed / 0.9987 => 0.9987
Passed / .9987 => 0.9987
Passed / 11 => 11
Passed / 11.1 => 11.1
Passed / 11.1111 => 11.1111
Passed / "abc" => "abc" 

答案 9 :(得分:0)

有关更多详细信息,请参见this answer

function numberFormat($number, $decimals = 0, $decPoint = '.' , $thousandsSep = ',')
{
    $negation = ($number < 0) ? (-1) : 1;
    $coefficient = pow(10, $decimals);
    $number = $negation * floor((string)(abs($number) * $coefficient)) / $coefficient;
    return number_format($number, $decimals, $decPoint, $thousandsSep);
}