0

これは末尾の「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

4 に答える 4

2

型キャストです。

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

結果は175%になります

于 2012-07-03T15:17:33.017 に答える
2

文字列を数学演算で使用したい場合で、例のように単位が最後に配置されていることがわかっている場合は、変数をfloatにキャストできます。

$item1_numeric = (float) $item1;

ただし、変数/データベースで値と単位を分離することをお勧めします。

于 2012-07-03T15:17:41.733 に答える
0

使用:ラウンドを行う場合、substr($ item1、0、-1)は$ item1のインスタッド、substr($ item2、0、-1)は$item2のインスタッドです。

2つの文字列をround()と比較することはできません。

編集:$ item1 = "200g"の場合、maソリューションは問題ありませんが、$ item1 = "200.00g"の場合、"。"を削除する必要があります。たとえばpregreplaceを使用したround()の前。

于 2012-07-03T15:17:16.040 に答える
0

ああ、YAPHPB - そして私のお気に入りの 1 つです。Docに書かれていますが:

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

... それは部分的な真実にすぎません: 比較される値の少なくとも 1 つが数値または数値文字列である場合。

それ以外の場合、すべての文字列は文字列として比較されます: 各文字列の最初の {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!

後者の結果は、数値の概念を知っている人なら実際に予測できます。両方の文字列が純粋な数値である場合、比較すると数値に変換されます。それでも、控えめに言っても、この動作は信頼できないことがわかりました。

結論: 数値を比較する必要がある場合は、数値と期間を比較します。PHP での型変換は、非常に厄介な作業になる可能性があります。)

于 2012-07-03T15:38:17.980 に答える