'для' петли и дурака (PHP) - PullRequest
       23

'для' петли и дурака (PHP)

0 голосов
/ 22 августа 2009

// match [0] содержит некоторые preg_match'ed значения

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;}   

 }

Разве это не работает, потому что цена $ является константой, поскольку она принадлежит циклу?

Я пытался сделать то же самое нормально, без цикла, и он работает правильно.

Я что-то здесь упускаю?

Ответы [ 3 ]

2 голосов
/ 22 августа 2009

Что-то, что я нашел, но это не обязательно решает все:

Никогда не сравнивайте поплавки по неравенству.

var_dump(0.7 + 0.1 == 0.8);

выходы false. Без шуток.

Это связано с тем, что это невозможно выразить некоторые дроби в десятичной записи с конечным количество цифр. Например, 1/3 в десятичная форма становится 0,3.

Если необходима более высокая точность, математические функции произвольной точности и gmp доступны функции.

Источник: PHP: числа с плавающей точкой проверить часть предупреждения

Кроме того, вы можете использовать PHP SimpleXML вместо предварительного сопоставления тегов вручную.

1 голос
/ 22 августа 2009

$matches[0][$i] содержит все выражение, включая теги. Для ссылки на *** 1 ***-й захват (вещь в скобках) используйте это вместо:

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

Или, что еще лучше, замените петлю for на foreach:

foreach ($matches[1] as $price)

Кроме того, посмотрите на операторы присваивания , посмотрите, как вы можете значительно упростить некоторые выражения, такие как

$price += 0.50;
0 голосов
/ 22 августа 2009

Возможно, вас заинтересует SimpleXML , чтобы получить значения из вашей строки / файла / источника xml (как уже упоминалось ранее) и математических функций BC, которые позволяют отправлять большинство ограничения точности.

<?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>';
}

отпечатков

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...