PHP不同类型数值相乘报错:小数计算后被向下取整为0如何解决
问题根因
number_format()函数返回值为字符串类型,后续直接用于数值比较、乘法运算时会触发PHP隐式类型转换,若传入的原始$price是使用逗号作为小数分隔符的格式(如示例中的0,43),转换时会直接截断逗号后的内容,得到数值0,这就是数值向下取整问题的核心原因。- 现有逻辑不符合业务规则,需求明确要求msrp不为0则优先使用msrp作为售价,但现有代码仅在
$msrp > $price时才使用msrp,逻辑不匹配。
修复方案
处理逻辑调整如下:
- 首先统一将输入的
$price转换为标准浮点型数值,兼容逗号作为小数分隔符的输入格式 - 先判断msrp是否大于0,符合条件直接返回msrp,再走后续阶梯定价规则
- 数值格式化仅在最终返回前执行,计算全程使用数值类型,避免隐式类型转换问题
修复后代码:
<?php function choose_price_to_return($msrp, $price) { // 处理价格格式,兼容逗号小数分隔符,转成浮点型用于计算 $price = str_replace(',', '.', $price); $price = (float)$price; // 优先走msrp规则,符合业务要求 if ($msrp > 0) { $actual_price = $msrp; } elseif ($price >= 0 && $price < 1) { $actual_price = $price * 4.00; } elseif ($price >= 1 && $price < 2) { $actual_price = $price * 3.00; } elseif ($price >= 2 && $price < 3) { $actual_price = $price * 2.00; } elseif ($price >= 3 && $price < 4) { $actual_price = $price * 1.90; } elseif ($price >= 4 && $price < 5) { $actual_price = $price * 1.80; } elseif ($price >= 5 && $price < 6) { $actual_price = $price * 1.70; } elseif ($price >= 6 && $price < 7) { $actual_price = $price * 1.60; } elseif ($price >= 7 && $price < 8) { $actual_price = $price * 1.50; } elseif ($price >= 8 && $price < 9) { $actual_price = $price * 1.49; } else { $actual_price = $price * 1.40; } // 仅在返回前做格式化输出 return number_format($actual_price, 2, '.', ''); } ?>
验证说明
传入$msrp=0、$price='0,43'的测试场景,修复后会先将价格转换为0.43的浮点值,计算得到0.43*4=1.72,返回结果为1.72,符合预期。
内容的提问来源于stack exchange,提问作者tech_and_electicity
相关产品推荐
相关产品推荐

