lcm.js

import divide from './divide';
import times from './times';
import gcd from './gcd';
import { round } from 'ut2';
/**
 * 最小公倍数。
 *
 * 遵循以下约定:
 *
 * 1. 如果参数中包含无效数值,返回 `NaN` 。
 * 2. 如果只有一个参数,另一个参数默认为 `1` 。
 * 3. 如果全部参数都为 `0` ,返回 `NaN` 。因为作为除数的最大公约数为 `0` ,结果为 `NaN` 。
 * 4. 如果全部参数都为 `Infinity` ,返回 `NaN` 。因为除数和被除数都是 `Infinity` ,结果为 `NaN` 。
 * 5. 如果参数包含 `0` ,返回 `0` 。
 * 6. 如果参数为负数,将转为绝对值的正数。
 * 7. 如果参数包含小数点,将转为四舍五入的整数。
 *
 * @alias module:Math.lcm
 * @since 4.20.0
 * @see {@link https://baike.baidu.com/item/最小公倍数 | 最小公倍数}
 * @param {...(number|string)} nums 两个或多个整数。
 * @returns {number} 最小公倍数。
 * @example
 *
 * lcm(3, 4); // 12
 * lcm(8, 4); // 8
 * lcm(2, 4, 8); // 32
 * lcm('foo', 'bar'); // NaN
 * lcm(0, 10); // 0
 * lcm(2.3, 3.8, 8, -10); // 320
 *
 */
function lcm(...nums) {
    let args = nums.map((item) => Math.abs(round(item)));
    if (args.length === 1) {
        args = args.concat([1]);
    }
    const product = args.indexOf(0) > -1 ? 0 : times(...args);
    return divide(product, gcd(...args));
}
export default lcm;