我正在尝试将用户输入的具有十进制结果的计算转换为分数。例如66.6666666667成66 2/3。有指针吗?
提前感谢
最佳答案
Continued fractions可用于在严格意义上找到对“最佳”实数的有理逼近。这是一个PHP函数,可找到给定(正)浮点数的有理近似值,其相对误差小于$tolerance
:
<?php
function float2rat($n, $tolerance = 1.e-6) {
$h1=1; $h2=0;
$k1=0; $k2=1;
$b = 1/$n;
do {
$b = 1/$b;
$a = floor($b);
$aux = $h1; $h1 = $a*$h1+$h2; $h2 = $aux;
$aux = $k1; $k1 = $a*$k1+$k2; $k2 = $aux;
$b = $b-$a;
} while (abs($n-$h1/$k1) > $n*$tolerance);
return "$h1/$k1";
}
printf("%s\n", float2rat(66.66667)); # 200/3
printf("%s\n", float2rat(sqrt(2))); # 1393/985
printf("%s\n", float2rat(0.43212)); # 748/1731
我已经写了更多关于该算法及其工作原理的文章,甚至在这里有一个JavaScript演示:https://web.archive.org/web/20180731235708/http://jonisalonen.com/2012/converting-decimal-numbers-to-ratios/