由於ceil(pow(10, $precision) * $value)/pow(10, $precision);
版本無法在某些情況下,例如round_up(2.22,2)給出了不正確的2.23,如here所述,所以我已將這個string solution for round_down()修改爲我們的round_up()問題。這是結果(不包括負精度):
function round_up($value, $precision) {
$value = (float)$value;
$precision = (int)$precision;
if ($precision < 0) {
$precision = 0;
}
$decPointPosition = strpos($value, '.');
if ($decPointPosition === false) {
return $value;
}
$floorValue = (float)substr($value, 0, $decPointPosition + $precision + 1);
$followingDecimals = (int)substr($value, $decPointPosition + $precision + 1);
if ($followingDecimals) {
$ceilValue = $floorValue + pow(10, -$precision); // does this give always right result?
}
else {
$ceilValue = $floorValue;
}
return $ceilValue;
}
我不知道它是防彈的,但至少可以消除上述失敗。我沒有做二進制到十進制數學分析,但如果$floorValue + pow(10, 0 - $precision)
工作 總是如預期那麼它應該沒問題。如果你會發現一些失敗的案例讓我知道 - 我們應該尋找另一種解決方案:)
我認爲操作順序爲混合起來,你需要劃分小區前,然後大量繁殖,而不是其他的方式,不是嗎? – nicolaskruchten 2010-01-15 20:43:24
@njk:ceiling(6244.64,-1)給出了期望的結果6250.請注意,在這種情況下精度是負值。 – 2010-01-15 20:59:04
這將返回true:'ceiling(77.4,2)=== 77.41'。功能被破壞。 – bzeaman 2017-04-15 09:18:38