locutus
Version:
Locutus other languages' standard libraries to JavaScript for fun and educational purposes
47 lines (46 loc) • 1.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.fmod = fmod;
function fmod(x, y) {
// discuss at: https://locutus.io/php/fmod/
// parity verified: PHP 8.3
// original by: Onno Marsman (https://twitter.com/onnomarsman)
// input by: Brett Zamir (https://brett-zamir.me)
// bugfixed by: Kevin van Zonneveld (https://kvz.io)
// bugfixed by: Irina (https://github.com/dekairi)
// example 1: fmod(5.7, 1.3)
// returns 1: 0.5
// example 2: fmod(10, 1)
// returns 2: 0
let tmp;
let tmp2;
let p = 0;
let pY = 0;
let l = 0.0;
let l2 = 0.0;
const normalizedX = Number(x);
const normalizedY = Number(y);
tmp = normalizedX.toExponential().match(/^.\.?(.*)e(.+)$/);
if (!tmp) {
return NaN;
}
p = Number.parseInt(tmp[2] ?? '0', 10) - (tmp[1] ?? '').length;
tmp = normalizedY.toExponential().match(/^.\.?(.*)e(.+)$/);
if (!tmp) {
return NaN;
}
pY = Number.parseInt(tmp[2] ?? '0', 10) - (tmp[1] ?? '').length;
if (pY > p) {
p = pY;
}
tmp2 = normalizedX % normalizedY;
if (p < -100 || p > 20) {
// toFixed will give an out of bound error so we fix it like this:
l = Math.round(Math.log(tmp2) / Math.log(10));
l2 = Math.pow(10, l);
return Number((tmp2 / l2).toFixed(l - p)) * l2;
}
else {
return parseFloat(tmp2.toFixed(Math.abs(p)));
}
}