Javascript:实现余数 0 产生除数的模数



在我目前的项目中,我经常需要知道一个数字在给定区间内的位置(它需要从1开始,而不是从0开始)。让我们以转换时间为例 - 从从 0 开始的 24 小时制到从 1 开始的 12 小时制(所以 12 是间隔)。给定 2 小时或 14 小时,"位置"应为 2。给定 0 或 12,位置等于 12(不是 0)。

显而易见的方法是模 -14 % 12 = 2如预期的那样。但是,12 % 12 = 0,就像我说的,它需要基于 1。我不能只是在模的结果中加上 1 来使其基于 1,因为这样区间 12 中 12 的位置将是 1,14 在 12 中的位置将是 3,依此类推。

我想出了2种方法来解决这个问题:

  1. position = value % interval || interval(依赖于假 0)
  2. position = (value - 1) % interval + 1(或者,如果您需要支持从 0 开始的值,例如在 24 小时制中,则会(value + interval - 1)
  3. )

应该使用哪种方法?
我应该注意的优点/缺点/潜在的陷阱吗?
还是有我不知道的更好的方法?

因此,根据我收到的评论,我最初提出的两种方法都缺乏类型检查以及它们如何处理零或负数。根据该反馈,我将函数更改为以下内容:

function positionInInterval( value, interval ) {
// Check for valid input
// Rather than throw an error, you could return undefined or NaN
if ( typeof value !== 'number' || typeof interval !== 'number' )
throw new TypeError('Argument type must be Number');
if ( interval < 2 )
throw new RangeError('Interval must be greater than 1');
if ( value < 0 )
return value % interval + interval;
return value % interval || interval;
}

它将所有数字视为在连续的"数线"上,包括负数,因此通过将value增加 1,它在interval中的"位置"总是增加 1,直到下一个区间。


注意:用户 Slai 表示||可能会使方法 1 比方法 2 稍慢,但至少在 Chrome 中,它们似乎并驾齐驱,除非我确定与Math.random()value,在这种情况下,||总是稍微快一点。


我知道与这个问题相关的用例是有限的,但我希望它能帮助到某人!这是我永远不知道我需要的信息,直到我偶然发现它。 :)

最新更新