我真的非常需要一个将毫米转换为分数(以英寸为单位)的 php 函数。
例如:
16mm = 5/8 英寸
321mm = 12 41⁄64 英寸
我已经搜索过任何 php 示例的高低,我完全被难住了。有没有善良的灵魂有这样的东西。
非常感谢你的帮助!
简单的部分是从毫米转换为英寸——只需除以 25.4。困难的部分是找到最近的第 32 位(或第 16 位、第 64 位等)。
在这个答案的最后,我包含了一个名为 toMixedNumber() 的函数。它遵循以下算法:
使用该功能很简单:
const MM_PER_IN = 25.4;
echo toMixedNumber(14 / MM_PER_IN, 32) . "\n"; // 9/16
echo toMixedNumber(55 / MM_PER_IN, 32) . "\n"; // 2 5/32
echo toMixedNumber(321 / MM_PER_IN, 32) . "\n"; // 12 5/8
echo toMixedNumber(321 / MM_PER_IN, 64) . "\n"; // 12 41/64
有趣的是,如果分母始终是 2 的幂(如您的情况),则可以进行优化。对于分子为正的真二元分数,分子中最低有效“1”位的值是分子和分母的 GCD:
if ($reduce) {
$gcd = $num & -$num;
$num /= $gcd;
$denom /= $gcd;
}
我采用了创新方式中的位旋转技巧来检查数字是否在有符号 int 中只有一个位,并且在我的计算机上,它可以将功能加速约 20%。(它之所以有效,是因为任何位的值都是所有更高位的值的除数,并且分母的唯一“1”位比分子中的任何位都更重要。)但是,我选择不包括它。
function toMixedNumber($arg, $denom, $reduce = true) {
$num = round($arg * $denom);
$int = (int)($num / $denom);
$num %= $denom;
if (!$num) {
return "$int";
}
if ($reduce) {
// Use Euclid's algorithm to find the GCD.
$a = $num < 0 ? -$num : $num;
$b = $denom;
while ($b) {
$t = $b;
$b = $a % $t;
$a = $t;
}
$num /= $a;
$denom /= $a;
}
if ($int) {
// Suppress minus sign in numerator; keep it only in the integer part.
if ($num < 0) {
$num *= -1;
}
return "$int $num/$denom";
}
return "$num/$denom";
}
基本答案,基于此站点。
function toFraction($inches)
{
$frac = $inches - intval($inches);
return intval($frac * 32);
}
该函数返回 32 英寸。
您可以使用 获得英寸数intval
。
对于毫米到英寸的转换,只需乘以 0.0393700787
function toInches($mm)
{
$inches = $mm * 0.0393700787;
$wholeInches = intval($inches);
$fraction = toFraction($inches);
return array('inches' => $wholeInches, '32nds' => $fraction);
}
我把 32nds 的简化留给你...