Skip to content
Permalink
9bfb9ba527
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
42 lines (33 sloc) 1.26 KB
'use strict';
var GetIntrinsic = require('get-intrinsic');
var $TypeError = GetIntrinsic('%TypeError%');
var isNaN = require('../../helpers/isNaN');
var isFinite = require('../../helpers/isFinite');
var truncate = require('../truncate');
var Type = require('../Type');
// https://262.ecma-international.org/14.0/#sec-numeric-types-number-remainder
module.exports = function NumberRemainder(n, d) {
if (Type(n) !== 'Number' || Type(d) !== 'Number') {
throw new $TypeError('Assertion failed: `n` and `d` arguments must be Numbers');
}
// If either operand is NaN, the result is NaN.
// If the dividend is an infinity, or the divisor is a zero, or both, the result is NaN.
if (isNaN(n) || isNaN(d) || !isFinite(n) || d === 0) {
return NaN;
}
// If the dividend is finite and the divisor is an infinity, the result equals the dividend.
// If the dividend is a zero and the divisor is nonzero and finite, the result is the same as the dividend.
if (!isFinite(d) || n === 0) {
return n;
}
if (!isFinite(n) || !isFinite(d) || n === 0 || d === 0) {
throw new $TypeError('Assertion failed: `n` and `d` arguments must be finite and nonzero');
}
var quotient = n / d;
var q = truncate(quotient);
var r = n - (d * q);
if (r === 0 && n < 0) {
return -0;
}
return r;
};