PHP:Max和Min返回不正确的结果

时间:2012-07-03 15:13:42

标签: php max percentage min

我确信这是因为最后的“g”,但这是我尝试计算比率百分比时的情景和结果。我总是希望将最高的2个数字除以最低值。

$item1 = "200.00g";
$item2 = "50.00g";
$calc = round((max($item1,$item2) / min($item1,$item2))*100) . "%";
// result: $calc = "400%"

$item1 = "100.00g";
$item2 = "5.00g";
$calc = round((max($item1,$item2) / min($item1,$item2))*100) . "%";
// result: $calc = "2000%"

PROBLEM RESULT:
$item1 = "8.00g";
$item2 = "14.00g";
$calc = round((max($item1,$item2) / min($item1,$item2))*100) . "%";
// result: $calc = "57%"
// I am expecting (14.00g / 8.00g)*100 = "175%"

4 个答案:

答案 0 :(得分:2)

它是类型铸造;

$item1 = "8.00";
$item2 = "14.00";
$calc = round((max($item1,$item2) / min($item1,$item2))*100) . "%";

结果将是175%

答案 1 :(得分:2)

如果您想在数学运算中使用字符串,并且您知道单位放在示例中的末尾,则可以将变量转换为浮点数:

$item1_numeric = (float) $item1;

但显然最好在变量/数据库中分隔值和单位。

答案 2 :(得分:0)

当你进行回合时,使用:$ item1的substr($ item1,0,-1)instade,$ item2的substr($ item2,0,-1)instade。

您无法将2个字符串与round()进行比较。

编辑:如果$ item1 =“200g”,则ma解决方案正常,但如果$ item1 =“200.00g”则需要删除“。”在round()之前使用例如pregreplace。

答案 3 :(得分:0)

哦,YAPHPB - 我最喜欢的一个。即使它是用the Doc写的:

When [max()] given a string it will be cast as an integer when comparing.

......这只是一个部分事实:如果至少有一个比较值是数字或数字字符串。

否则所有字符串将被比较为字符串:将比较每个字符串的第一个{0}个字符,然后是{1},然后是{2} ...等等。

所以基本上就是这里发生的事情:

echo max("200.00g", "50.00g"); // 50.00g, as '5' > '2'
echo max("200.00g", 50);       // "200.00g", as it gets converted to int (become 200)

这更加疯狂:

echo max("200.00g", "1000.00"); // "200.00g", as '2' > '1'
echo max("200.00", "1000.00");  // "1000.00", as we tried to help you, no, really!

后者的结果实际上可以由知道numeric概念的人预测:当两个字符串都是纯数字时,它们在比较时会转换为数字。尽管如此,我发现这种行为至少可以说是不可靠的。

底线:如果您需要比较数字,请比较数字,期间。 PHP中的类型转换可能会变得非常混乱 - 当您最不期望它时,会让您陷入困境。 )