UNPKG

locutus

Version:

Locutus other languages' standard libraries to JavaScript for fun and educational purposes

44 lines (43 loc) 1.41 kB
export 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))); } }