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
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,但它现在是一个死链接.
我认为有一种非常简单的方法可以实现这一目标:
$rounded = bcdiv($val, 1, $precision);
Run Code Online (Sandbox Code Playgroud)
这是一个工作示例。您需要安装 BCMath,但我认为它通常与 PHP 安装捆绑在一起。:)这是文档。
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