1

我真的非常需要一个将毫米转换为分数(以英寸为单位)的 php 函数。

例如:

16mm = 5/8 英寸
321mm = 12 41⁄64 英寸

我已经搜索过任何 php 示例的高低,我完全被难住了。有没有善良的灵魂有这样的东西。

非常感谢你的帮助!

4

2 回答 2

1

简单的部分是从毫米转换为英寸——只需除以 25.4。困难的部分是找到最近的第 32 位(或第 16 位、第 64 位等)。

在这个答案的最后,我包含了一个名为 toMixedNumber() 的函数。它遵循以下算法:

  • 将浮点值乘以所需的分母,四舍五入到最接近的单位。
  • 除以分母。商是整数部分,余数是分子。
  • (可选)通过将分子和分母除以最大公约数 (GCD) 将小数部分减少到最低项。GCD 可以使用Euclid 算法计算
  • 根据需要将整数和小数部分格式化为“i”、“n/d”或“in/d”格式的字符串。在“in/d”的情况下,删除小数部分中的任何减号。

使用该功能很简单:

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";
}

上述示例代码的许可证

于 2013-01-05T09:53:44.317 回答
0

基本答案,基于此站点

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 的简化留给你...

于 2012-12-10T23:38:20.137 回答