0

我想创建一个循环,不断添加一组分数,在我的示例中为 1/3,稍后我可以检查与整数值的匹配。

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

我的想法是 .333 + .333 变为 .666,如果四舍五入将变为 0.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/>";
    }
    }


?>

我会以一种完全愚蠢的方式来解决这个问题吗?

不需要值不是整数时的准确性,只是它可以 == 使用整数。

4

2 回答 2

0

我不确定您为什么要四舍五入这些值...

$i = 1/3;

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

// prints:
// 0.33333333333333
// 1
// 1
于 2013-10-21T09:50:56.957 回答
0

如果您真的想准确地处理有理数(不能在有限精度的 IEEE754 数据类型中表示的有理数),您应该它们存储为有理数。

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

这样,该值将保持准确到终点,您可以将有理数打印为有理数,也可以其转换为十进制,只有一级转换“错误”,而不是其中许多被累积。

于 2015-07-31T04:50:27.810 回答