// 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是一个常数,因为它属于一个循环吗?
我通常尝试相同的事情,没有循环,并且它正确地进行了类型转换。
我在这里错过了什么吗?
答案 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