PHP 四舍五入数字
我似乎无法弄清楚如何在 PHP 中始终进行舍入。 ceil() 是显而易见的选择,但我需要与 round() 提供的第二个参数“精度”相同的功能。这是一个示例:
// Desired result: 6250 echo round(6244.64, -2); // returns 6200 echo round(6244.64, -1); // returns 6240 echo ceil(6244.64) // returns 6245
我需要数字始终向上舍入,以便我可以根据图表的参数计算等除数。
I cannot seem to figure out how to always round up in PHP. ceil()
would be the obvious choice but I need the same functionality that round()
provides with its second parameter "precision". Here is an example:
// Desired result: 6250 echo round(6244.64, -2); // returns 6200 echo round(6244.64, -1); // returns 6240 echo ceil(6244.64) // returns 6245
I need the number to always round up so that I can calculate an equal divisor based on parameters for a chart.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
来自对 http://php.net/manual/en/function.ceil.php 的评论:
From a comment on http://php.net/manual/en/function.ceil.php:
其中一些答案存在浮点运算问题,可能会失败,如
Some of these answers have issues with floating point arithmetic which can fail as shown in this answer. For a bulletproof solution in all cases, use these:
由于版本
ceil(pow(10, $ precision) * $value) / pow(10, $ precision);
在某些情况下失败,例如 round_up(2.22, 2) 给出了错误的 2.23,如前面提到的 这里,所以我改编了这个< em>string round_down() 的 round_up() 问题的解决方案。这就是结果(不包括负精度):我不知道它是防弹的,但至少它消除了上述失败。我没有进行二进制到十进制的数学分析,但如果
$floorValue + pow(10, 0 - $ precision) 有效
总是如预期的那样应该没问题。如果您发现一些失败的案例,请告诉我 - 我们应该寻找另一个解决方案:)
As version
ceil(pow(10, $precision) * $value) / pow(10, $precision);
fails in some cases, e.g. round_up(2.22, 2) gives incorrect 2.23 as mentioned here, so I have adapted this string solution for round_down() to our round_up() problem. This is the result (a negative precision is not covered):I don't know it is bulletproof, but at least it removes the above mentioned fail. I have done no binary-to-decimal-math-analysis but if
$floorValue + pow(10, 0 - $precision)
worksalways as expected then it should be ok. If you will find some failing case let me know - we should look for another solution :)
你可以除以 10,ceil();然后乘以十
You could divide by 10, ceil(); and then multiply by ten
另一种精确的 ceil 解决方案,无 pow,看起来两边都可以使用 9 位数字:
One more solution for ceil with precision, no pow, it looks like works 9 digits both sides: