PHP中ceil计算结果与手动计算不符问题排查
价格计算函数返回值异常的原因分析
核心问题
你传入的$price值是字符串"1,76",PHP对这种带逗号的数字字符串的解析规则导致了计算偏差:PHP会将逗号视为非数字终止符,只解析逗号前的部分,也就是把"1,76"解析成整数1,而非你预期的浮点数1.76。
错误计算过程(传入"1,76"时)
- 解析后
$price = 1,计算1 * 9.3 = 9.3 9.3 / 10 = 0.93,经过ceil()向上取整得到11 * 10 = 10,减去0.05后得到9.95- 该结果等于你设置的
$map参数值,因此函数返回9.95
正确计算过程(传入1.76时)
这也是你手动计算的逻辑:
1.76 * 9.3 = 16.36816.368 / 10 = 1.6368,ceil()向上取整得到22 * 10 = 20,减去0.05后得到19.95
修复方案
在函数开头增加对价格参数的格式处理,将逗号分隔的字符串转换为标准浮点数:
function round_price_with_limits( $price = null, $multiplier = 9.3, $nearest = 10, $minus = 0.05, $map = 9.95, $msrp = 9999999999) { // 处理带逗号的数字字符串,转换为标准浮点数 if (is_string($price)) { $price = str_replace(',', '.', $price); $price = (float)$price; } // Ensure a price was provided. if ( !empty( $price ) ) { // Calculate price with markup and round it. $rounded_price = ( ceil ( ( $price * $multiplier ) / $nearest ) * $nearest ) - $minus; // If price is less than minimum, return minimum. if($rounded_price < $map){ return $map; } // If price is greater than maximum, return maximum. elseif($rounded_price > $msrp){ return $msrp; } else { // Return price otherwise. return $rounded_price; } } }
内容的提问来源于stack exchange,提问作者prokops
相关产品推荐
相关产品推荐

