Döngü ve tiplemeleri cehennem 'için'!

3 Cevap php

/ / Karşılaşmalar [0] bazı preg_match'ed değerleri tutan

for($i=0;$i<count($matches[0]);$i++)
 {

  $price = $matches[0][$i]; //a**uto type casting to (float) returns 0 for $price. Tried it for values greater than 1 too.**
  //echo gettype($price);
  $price = $price + 0.01; **//Returns 0 + 0.01 instead of the right answer**
    //**even after removing the above statement it does not compare**
    if($price <= 1.50 && $price >= 1.00){ //because it should auto type cast to float, which it does no...
      echo "here";
    	$price = $price+0.50;}
    //strcmp always returns a '1' where 1 is surely not expected (not equal)
    else if(strcmp($price,"1.50") > 0)  && strcmp($price,"2.00") < 0 ){
      echo "here 2";
    	$price = $price+0.50;}   

 }

Bu bir döngü ait $ olarak fiyat bir sabit olduğundan bu işe yaramazsa?

Ben döngü olmadan, normalde aynı şeyi denedim ve düzgün tipleştiriyor.

Ben burada bir şey eksik?

3 Cevap

Ben mutlaka tüm şey çözmüyor hangi bir şey bulunamadı:

Eşitsizlik için yüzer karşılaştırmak asla.

var_dump(0.7 + 0.1 == 0.8);

çıkışları false. Şaka yapmıyorum.

This is due to the fact that it is impossible to express some fractions in decimal notation with a finite number of digits. For instance, 1/3 in decimal form becomes 0.3.

If higher precision is necessary, the arbitrary precision math functions and gmp functions are available.

Kaynak: PHP: Floating point numbers uyarı bölümünü kontrol

Ayrıca, yerine elle etiketleri preg_matching PHP en SimpleXML kullanabilirsiniz.

$matches[0][$i] etiketleri de dahil olmak üzere, tüm ifadeyi içeriyor. Başvurmak için 1 st yakalama (parantez içinde bir şey) yerine bunu kullanın:

$price = $matches[1][$i];

Ya da daha iyisi, ile for döngü yerine foreach:

foreach ($matches[1] as $price)

Ayrıca, assignment operators, büyük ölçüde gibi bazı ifadeleri basitleştirmek nasıl görmek bir göz atın

$price += 0.50;

Siz de ilginizi çekebilir SimpleXML (daha önce belirtildiği gibi) xml dizesi / dosya / kaynağından değerleri almak ve BC Math functions hangi etrafında en hassas limitiations gemi olanak sağlar.

<?php
$items = new SimpleXMLElement(getXml());
// setting bcmath's default scale to two (digits after the .)
bcscale(2); 

foreach( $items as $item ) {
  $price = bcadd($item->price, '0.01');
  echo $price, " -> ";
  if ( -1<bccomp($price, '1.00') && 1>bccomp($price, '1.50') ) {
    $price = bcadd($price, '0.50');
    echo 'a) price+0.50=', $price, "\n";
  }
  else if ( 0<bccomp($price, '1.50') && 1>bccomp($price, '2.00') ) {
    $price = bcadd($price, '0.50');
    echo 'b) price+0.50=', $price, "\n";
  }
  else {
    $price = bcadd($price, '0.10');
    echo 'c) price+0.10=', $price, "\n";
  }
}

function getXml() {
  return '<foo>
    <item>
      <description>a</description>
      <price>1.48</price>
    </item>
    <item>
      <description>b</description>
      <price>1.49</price>
    </item>
    <item>
      <description>c</description>
      <price>1.50</price>
    </item>
    <item>
      <description>d</description>
      <price>1.99</price>
    </item>
    <item>
      <description>e</description>
      <price>2.00</price>
    </item>
  </foo>';
}

baskılar

1.49 -> a) price+0.50=1.99
1.50 -> a) price+0.50=2.00
1.51 -> b) price+0.50=2.01
2.00 -> b) price+0.50=2.50
2.01 -> c) price+0.10=2.11