Javascript:实现模数,其中余数0代替除数

时间:2018-01-15 01:03:47

标签: javascript math

在我目前的项目中,我经常需要知道给定间隔内数字的位置(并且它需要基于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,12中14的位置将是3,依此类推。

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

  1. position = value % interval || interval(依赖假名0)
  2. position = (value - 1) % interval + 1(或者如果你需要支持从0开始的值,就像在24小时制中那样,那将是(value + interval - 1)
  3. 应该使用以下哪种方法? 我应该注意哪些利弊/潜在的陷阱? 或者有一种我不知道的更好的方法吗?

1 个答案:

答案 0 :(得分:0)

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

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,其位置为&#39;在interval中总是增加1,直到下一个间隔。


注意:用户Slai表示||可能会使方法1略慢于方法2,但至少在Chrome中,它们似乎是颈部和颈部, 除了,当我用value确定Math.random()时,||总是稍快一些。

我知道与此问题相关的用例是有限的,但我希望它可以帮助某人!在我偶然发现之前,这是我从未知道的那种信息。 :)