PHP Ceil和Floor到最接近的100与舍入

时间:2015-08-25 11:55:56

标签: php

我有两个不同的功能天花板和地板,它们将给定数字的ceil或floor落到函数中指定的数字。功能如下:

function ceiling($number, $significance) {
if ($significance != null) {
    return (is_numeric($number) && is_numeric($significance) ) ? (ceil($number / $significance) * $significance) : $number;
} else {
    return $number;
}}

function flooring($number, $significance) {
if ($significance != null) {
    return (is_numeric($number) && is_numeric($significance) ) ? (floor($number / $significance) * $significance) : $number;
} else {
    return $number;
}}

使用上述功能,结果如下:

echo ceiling(125, 100);     // 200
echo ceiling(2785, 1000);   // 3000

echo flooring(125, 100);    // 100
echo flooring(2785, 1000);  // 2000

问题陈述:

我有一个特定的数字,1234,它将乘以汇率,即0.7268。这将生成一个特定的数字,但必须使用天花板函数将其四舍五入到最接近的100,其显着性为100.

$rate = 0.7268;
$res = $rate * 1234;
$res = ceiling($res, 100); // result : 900

将其四舍五入到最近的100后,上述结果将为900。

现在在代码的不同部分,我可以访问结果900,汇率0.7268和用于舍入的值,在我们的情况下为100。是否可以将初始值1234作为答案。

我猜这必须以某种方式使用地板功能,但我无法安静使其工作。

这就是我的尝试:

$final = $res * (1 / $rate);
$final = flooring($final, 100); // result : 1200 which is wrong.

对此的正确答案是1234。

感谢。

2 个答案:

答案 0 :(得分:2)

首先,您的flooring()函数与ceiling()函数没有相反的作用,例如serialize()unserialize()。它在相反的方向做同样的事情。

但即使你有一个unceiling()函数,它也无法确定它应该返回x00和x99之间的值。

结论:这不可行。

答案 1 :(得分:1)

从我的评论中:我不认为它会尽我所能。当你圆形的东西,就其本质而言,你正在从中去除它的精确度。这意味着,当你颠倒过程时,你将无法获得准确性'返回'

<强>替代

如果你有一个班级用于赚钱,那么你可以轻松拥有一个功能。在我的头顶:

class Money{
    public $amount;

    function ceiled(){
        return ceiling($this->amount, 100); 
    }
}

这意味着在您的代码中,您仍然可以执行诸如将金额乘以您需要的任何内容之类的事情,但无论何时您需要向用户显示“贪图”。这个数字的版本,你只要求它作为一个关闭,即

<?php 
$money = new Money();
$money->amount = 1234;
echo "Current amount is roughly " . $money->ceiled();

// apply exchange rate 
$money->amount *= 0.7268;
echo "New amount is roughly " . $money->ceiled();

因此,您永远不会将天花板数量保存为变量,只需在代码中存在更准确的变量时将其显示给用户。