将数字限制为一个区段的最优雅方法是什么?

2022-08-30 01:52:35

比方说,是数字。我需要限制在段的边界内。xabx[a, b]

换句话说,我需要一个钳位函数

clamp(x) = max( a, min(x, b) )

任何人都可以想出一个更具可读性的版本吗?


答案 1

你这样做的方式是相当标准的。您可以定义一个实用程序函数:clamp

/**
 * Returns a number whose value is limited to the given range.
 *
 * Example: limit the output of this computation to between 0 and 255
 * (x * 255).clamp(0, 255)
 *
 * @param {Number} min The lower boundary of the output range
 * @param {Number} max The upper boundary of the output range
 * @returns A number in the range [min, max]
 * @type Number
 */
Number.prototype.clamp = function(min, max) {
  return Math.min(Math.max(this, min), max);
};

(尽管扩展语言内置通常不受欢迎)


答案 2

一个不那么“数学”导向的方法,但也应该工作,这样,/测试被暴露出来(也许比最小最大化更容易理解),但它实际上取决于你所说的“可读”是什么意思<>

function clamp(num, min, max) {
  return num <= min 
    ? min 
    : num >= max 
      ? max 
      : num
}