在PHP中添加分数

时间:2013-10-21 08:16:45

标签: php rounding floating-accuracy

我想在我的示例1/3中创建一个不断添加集合小数的循环,稍后我可以检查是否存在与整数值的匹配。

显然当php添加1/3 + 1/3 + 1/3时,结果为0.9999999,所以我想我可以偶尔使用一轮来帮助我,但这也不起作用。

我的想法是.333 + .333变为.666并且如果四舍五入将变为.667,那么+ .333并且结果为1.但是圆形似乎只对我有用,如果实际减少的位数。如此圆(0.666,3)仍为0.666

<?php
    $denom = 3;
    $frac = 1/$denom;
    $frac = round($frac,3);

    $value = 0;
    $max =24;
    for($f = 1; $f <= $max; $f++){
    echo "old value is now at ".$value.".<br/>";
    $value = $value+$frac;
    echo "value is now at ".$value.".<br/>";
    $value = round($value,3);
    echo "rounded value is now at ".$value.".<br/>";
    $valueArray[$f] = $value;
    //and here for ease of testing....
    if (($value==1)OR ($value==2)OR ($value==3)OR ($value==4)OR ($value==5)OR ($value==6)OR ($value==7)OR ($value==8)){
         echo "match!<br/>";
    }else{
        echo "no match!<br/>";
    }
    }


?>

我是以一种完全愚蠢的方式来做这件事的吗?

当值不是整数时,不需要精度,只需它可以==整数。

2 个答案:

答案 0 :(得分:0)

我不确定你为什么试图绕过价值观......

$i = 1/3;

echo $i . PHP_EOL;
echo 3*$i . PHP_EOL;
echo $i+$i+$i . PHP_EOL;

// prints:
// 0.33333333333333
// 1
// 1

答案 1 :(得分:0)

如果你真的想要准确处理有理数(那些无法在有限精度IEEE754数据类型中表示的那些),你应该存储它们作为有理数。

换句话说,给自己一个可以处理类型{numerator, denominator}(两个整数)的类,并执行你需要的算术。

这样,值保持准确到结束点,在那里你可以打印出理性一个有理数,或者将它转换为十进制只有一个转换级别“错误”而非许多正在累积。