'for'loop and typecasting hell! (PHP)

时间:2009-08-22 15:09:55

标签: php loops for-loop

// matches [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;}   

 }

这不起作用,因为$ price是一个常数,因为它属于一个循环吗?

我通常尝试相同的事情,没有循环,并且它正确地进行了类型转换。

我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:2)

我找到的东西并不一定能解决整个问题:

永远不要将浮动数据与不平等进行比较。

var_dump(0.7 + 0.1 == 0.8);

输出false。开个玩笑。

  

这是因为事实确实如此   不可能表达一些分数   用有限的十进制表示法   位数。例如,1/3英寸   十进制形式变为0.3。

     

如果需要更高的精度,   arbitrary precision math functions和   gmp功能可用。

来源:PHP: Floating point numbers查看警告部分

此外,您可以使用PHP的 SimpleXML ,而不是手动preg_matching标记。

答案 1 :(得分:1)

$matches[0][$i]包含整个表达式,包括标记。要参考*** 1 *** st捕获(括号中的东西),请改用:

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

或者更好的是,将for循环替换为foreach

foreach ($matches[1] as $price)

另外,请查看assignment operators,了解如何大大简化某些表达式,例如

$price += 0.50;

答案 2 :(得分:0)

您可能会对SimpleXML感兴趣,以获取xml字符串/文件/来源(如前所述)和BC Math functions中的值,这样可以提供大多数精度限制。

<?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