2017-01-13 3 views
0

このような簡単な質問を投稿するのは難しいですが、金曜日は13日ですが、それが私のコードにいくつかの種類の超自然的な影響を及ぼすかどうかはわかりません!非常に基本的なPHP if文がすべての論理を無視しています

ここはif文です。

if ($invoice_grand_total > floatval($payment_details['TotalPayments'])) { 

次のコード。

echo $invoice_grand_total . ' = ' . floatval($payment_details['TotalPayments']) 

return;

6.88 = 6.88 

var_dump;

echo $outstanding_invoices_count . ' invoice_grand_total = ' . var_dump($invoice_grand_total) . '<br/>'; 
echo $outstanding_invoices_count . ' TotalPayments = ' . var_dump(floatval($payment_details['TotalPayments'])) . '<br/>'; 

return;

float(18) 0 invoice_grand_total = 
float(18) 0 TotalPayments = 
float(199) 0 invoice_grand_total = 
float(199) 0 TotalPayments = 
float(125) 0 invoice_grand_total = 
float(125) 0 TotalPayments = 
float(60) 0 invoice_grand_total = 
float(60) 0 TotalPayments = 
float(55) 0 invoice_grand_total = 
float(55) 0 TotalPayments = 
float(60) 0 invoice_grand_total = 
float(60) 0 TotalPayments = 
float(10) 0 invoice_grand_total = 
float(10) 0 TotalPayments = 
float(3.64) 0 invoice_grand_total = 
float(3.64) 0 TotalPayments = 
float(295) 0 invoice_grand_total = 
float(295) 0 TotalPayments = 
float(25.45) 0 invoice_grand_total = 
float(25.45) 0 TotalPayments = 
float(110) 0 invoice_grand_total = 
float(110) 0 TotalPayments = 
float(2.41) 0 invoice_grand_total = 
float(2.41) 0 TotalPayments = 
float(0.04) 0 invoice_grand_total = 
float(0.04) 0 TotalPayments = 
float(25.45) 0 invoice_grand_total = 
float(25.45) 0 TotalPayments = 
float(6.01) 0 invoice_grand_total = 
float(6.01) 0 TotalPayments = 
float(29.09) 0 invoice_grand_total = 
float(29.09) 0 TotalPayments = 
float(6.88) 0 invoice_grand_total = 
float(6.88) 0 TotalPayments = 

var_dumpを使用しないで返します。

0 invoice_grand_total = 18 
0 TotalPayments = 18 
0 invoice_grand_total = 199 
0 TotalPayments = 199 
0 invoice_grand_total = 125 
0 TotalPayments = 125 
0 invoice_grand_total = 60 
0 TotalPayments = 60 
0 invoice_grand_total = 55 
0 TotalPayments = 55 
0 invoice_grand_total = 60 
0 TotalPayments = 60 
0 invoice_grand_total = 10 
0 TotalPayments = 10 
0 invoice_grand_total = 3.64 
0 TotalPayments = 3.64 
0 invoice_grand_total = 295 
0 TotalPayments = 295 
0 invoice_grand_total = 25.45 
0 TotalPayments = 25.45 
0 invoice_grand_total = 110 
0 TotalPayments = 110 
0 invoice_grand_total = 2.41 
0 TotalPayments = 2.41 
0 invoice_grand_total = 0.04 
0 TotalPayments = 0.04 
0 invoice_grand_total = 25.45 
0 TotalPayments = 25.45 
0 invoice_grand_total = 6.01 
0 TotalPayments = 6.01 
0 invoice_grand_total = 29.09 
0 TotalPayments = 29.09 
0 invoice_grand_total = 6.88 
0 TotalPayments = 6.88 

以下は完全なコードブロックです。

// outstanding invoice details 

echo '<fieldset> 
<legend>Outstanding Invoice Details</legend>'; 

echo '<table class="solid" style="margin:5px;">'; 

echo '<tr> 
    <th>Invoice #</th> 
    <th>Date</th> 
    <th>Invoice Total</th> 
    <th>Amount Paid</th> 
    <th>Amount Due</th> 
    </tr>'; 

$invoice_grand_total = 0.00; 
$outstanding_invoices_count = 0; 

$invoice_details_query = mysqli_query($con, "SELECT * FROM accounts_invoice WHERE invoice_customer_type='" . $invoice_customer_type . "' AND invoice_customer='" . $invoice_customer . "' AND invoice_posted='1' AND invoice_tenancy_id='" . $tenancy_id . "'") or die(mysql_error()); 

while($invoice_details_row = mysqli_fetch_array($invoice_details_query)) { 

$invoice_grand_total = $invoice_details_row['invoice_total_amount_exc_vat'] + $invoice_details_row['invoice_total_vat_amount']; 

$payment_details_query = mysqli_query($con, "SELECT SUM(invoice_payment_amount) AS TotalPayments FROM accounts_invoice_payment WHERE invoice_payment_invoice_id='" . $invoice_details_row['invoice_id'] . "'") or die(mysql_error()); 

$payment_details = mysqli_fetch_array($payment_details_query); 

echo $outstanding_invoices_count . ' invoice_grand_total = ' . var_dump($invoice_grand_total) . '<br/>'; 
echo $outstanding_invoices_count . ' TotalPayments = ' . var_dump(floatval($payment_details['TotalPayments'])) . '<br/>'; 

if (floatval($invoice_grand_total) > floatval($payment_details['TotalPayments'])) { 

$outstanding_invoices_count++; 

echo '<tr> 
    <td>' . $invoice_grand_total . ' = ' . floatval($payment_details['TotalPayments']) . '</td> 
    <td><a href="view_invoice.php?invoice_id=' . $invoice_details_row['invoice_id'] . '" target="_blank">' . $invoice_details_row['invoice_id'] . '</a></td> 
    <td>' . ConvertDate($invoice_details_row['invoice_date']) . '</td> 
    <td>&pound;' . number_format($invoice_grand_total, 2, '.', ',') . '</td> 
    <td>&pound;' . number_format($payment_details['TotalPayments'], 2, '.', ',') . '</td> 
    <td>&pound;' . number_format(($invoice_grand_total - $payment_details['TotalPayments']), 2, '.', ',') . '</td> 
    </tr>'; 

} 
} 

if ($outstanding_invoices_count==0) { echo '<tr><td colspan="10">There are no outstanding invoices.</td></tr>'; } 

echo '</table>'; 

if ($outstanding_invoices_count!=0) { 

echo '<table class="nobord">'; 

echo '<tr><td><span class="red">The above invoices are outstanding for this landlord. Click <a href="add_invoice_payment.php?invoice_customer_type=1&invoice_customer=' . $invoice_customer . '&invoice_tenancy_id=' . $tenancy_id . '">here</a> to add an invoice payment.</span></td></tr>'; 

echo '</table>'; 

} 

echo '</fieldset>'; 

なぜ条件6.88 = 6.88にもかかわらず6.88 > 6.88実行の場合はブロック?

解決策;

if文を次のように変更しました。

if (round($invoice_grand_total, 2) > round($payment_details['TotalPayments'], 2)) { 
+0

を、あなたは、いくつかのvar_dumpsを追加してくださいだろうか?どのデータ型が$ invoice_grand_totalと$ payment_details ['TotalPayments']ですか? –

+0

var_dumpを使用しましたか?これまで浮動小数点精度と考えられていましたか不明な場合は 'bin2hex(pack(" d "))'を比較してください。 – SOFe

+1

if(floatval($ invoice_grand_total)> floatval($ payment_details ['TotalPayments'])){ – coder

答えて

3

あなたは、このような平等のための浮動小数点値を比較することはありません通常、あなたが最小の許容差を使用する必要があります。

Do not compare floating point numbers for equality.

+0

頭をアップしてくれてありがとうが、小数点以下2桁までしか作業していないときはそれほど重要ですか?また、論理を無視するように見えるので、私の現在のコードがうまくいかない理由を調べることは興味深いでしょう –

+0

浮動小数点数は100%正確ではありません! PHPでの計算結果が10.00000000001で、10と等しくない場合があります。 – NID

+0

浮動体を比較する前に、sprintf(http://php.net/manual/en/function.sprintf.php)を使用して書式を設定してください。 – NID

関連する問題