PHP如何向下舍入到小数点后两位?

Ada*_*oss 41 php decimal rounding number-formatting

我需要将PHP中的小数舍入到小数点后两位,以便:

49.955
Run Code Online (Sandbox Code Playgroud)

成为...

49.95
Run Code Online (Sandbox Code Playgroud)

我尝试过number_format,但这只是将值四舍五入到49.96.我不能使用substr因为数字可能更小(例如7.950).到目前为止,我一直无法找到答案.

任何帮助非常感谢.

Geo*_*eyB 77

这可以工作: floor($number * 100) / 100

  • 不能可靠地工作http://sandbox.onlinephpfunctions.com/code/c2859438f01cdb70506aa89888e17830565fb45b (6认同)
  • 但不是由于 floor 函数,而是奇怪的 PHP 数学。`9.7 * 100; // 浮动 970` `(int) (9.7 * 100); // 整数 969` (2认同)
  • 不是奇怪的 PHP 数学,而是大多数编程语言中都存在的浮点数精度问题 (2认同)

huy*_*itw 23

这是一个不使用字符串函数的好功能:

<?php
function floorp($val, $precision)
{
    $mult = pow(10, $precision); // Can be cached in lookup table        
    return floor($val * $mult) / $mult;
}

print floorp(49.955, 2);
?>
Run Code Online (Sandbox Code Playgroud)

另一种选择是在舍入之前减去一个分数:

function floorp($val, $precision)
{
    $half = 0.5 / pow(10, $precision); // Can be cached in a lookup table
    return round($val - $half, $precision);
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 19

不幸的是,之前的答案(包括已接受的答案)都不适用于所有可能的输入.

1) sprintf('%1.'.$precision.'f', $val)

精度为2:14.239的失败应返回14.23(但在这种情况下返回14.24).

2) floatval(substr($val, 0, strpos($val, '.') + $precision + 1))

精度为0:14的失败应返回14(但在这种情况下返回1)

3) substr($val, 0, strrpos($val, '.', 0) + (1 + $precision))

精度为0的失败:-1应返回-1(但在这种情况下返回' - ')

4) floor($val * pow(10, $precision)) / pow(10, $precision)

虽然我广泛使用这个,但我最近发现了它的一个缺陷; 它也失败了一些价值观.精度为2:2.05应该返回2.05(但在这种情况下返回2.04 !!)

到目前为止,传递所有测试的唯一方法是使用字符串操作.我的解决方案基于rationalboss,是:

function floorDec($val, $precision = 2) {
    if ($precision < 0) { $precision = 0; }
    $numPointPosition = intval(strpos($val, '.'));
    if ($numPointPosition === 0) { //$val is an integer
        return $val;
    }
    return floatval(substr($val, 0, $numPointPosition + $precision + 1));
}
Run Code Online (Sandbox Code Playgroud)

此功能适用于正数和负数,以及所需的任何精度.

编辑:你可以在这里找到一个有效的例子:http://codepad.viper-7.com/ZGprQJ,但它现在是一个死链接.


Jam*_*son 9

我认为有一种非常简单的方法可以实现这一目标:

$rounded = bcdiv($val, 1, $precision);
Run Code Online (Sandbox Code Playgroud)

这是一个工作示例。您需要安装 BCMath,但我认为它通常与 PHP 安装捆绑在一起。:)这是文档


Gor*_*onM 6

将输入乘以100,floor(),然后将结果除以100.


Ste*_*son 6

function roundDown($decimal, $precision)
{
    $sign = $decimal > 0 ? 1 : -1;
    $base = pow(10, $precision);
    return floor(abs($decimal) * $base) / $base * $sign;
}

// Examples
roundDown(49.955, 2);           // output: 49.95
roundDown(-3.14159, 4);         // output: -3.1415
roundDown(1000.000000019, 8);   // output: 1000.00000001
Run Code Online (Sandbox Code Playgroud)

此函数适用于任何精度的正小数和负小数。

这里的代码示例:http : //codepad.org/1jzXjE5L


小智 5

您可以使用 bcdiv PHP 函数。

bcdiv(49.955, 1, 2)
Run Code Online (Sandbox Code Playgroud)