我想在我的示例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/>";
}
}
?>
我是以一种完全愚蠢的方式来做这件事的吗?
当值不是整数时,不需要精度,只需它可以==整数。
答案 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}
(两个整数)的类,并执行你需要的算术。
这样,值保持准确到结束点,在那里你可以打印出理性为一个有理数,或者将它转换为十进制只有一个转换级别“错误”而非许多正在累积。