{"record":{"id":"890d6b2779dc0d68","repo":"karatelabs/karate","slug":"toexponential-fractiondigits-must-be-between-0-and-100","errorCode":null,"errorMessage":"toExponential() fractionDigits must be between 0 and 100","messagePattern":"toExponential\\(\\) fractionDigits must be between 0 and 100","errorType":"exception","errorClass":"JsErrorException","httpStatus":null,"severity":"error","filePath":"karate-js/src/main/java/io/karatelabs/js/JsNumberPrototype.java","lineNumber":181,"sourceCode":"        if (args.length > 0 && args[0] instanceof java.math.BigInteger) {\n            throw JsErrorException.typeError(\"Cannot convert a BigInt to a number\");\n        }\n        boolean digitsAbsent = args.length == 0 || args[0] == Terms.UNDEFINED;\n        int digits = digitsAbsent ? 0 : toIntegerArg(args[0], context);\n        if (Double.isNaN(d)) return \"NaN\";\n        if (d == Double.POSITIVE_INFINITY) return \"Infinity\";\n        if (d == Double.NEGATIVE_INFINITY) return \"-Infinity\";\n        if (d == 0.0) {\n            // Spec §21.1.3.2: zero exponent always renders as \"+0\"; -0 strips its sign.\n            if (digitsAbsent || digits == 0) return \"0e+0\";\n            StringBuilder sb = new StringBuilder(digits + 5);\n            sb.append(\"0.\");\n            for (int i = 0; i < digits; i++) sb.append('0');\n            sb.append(\"e+0\");\n            return sb.toString();\n        }\n        if (!digitsAbsent && (digits < 0 || digits > 100)) {\n            throw JsErrorException.rangeError(\"toExponential() fractionDigits must be between 0 and 100\");\n        }\n        String formatted;\n        if (digitsAbsent) {\n            // Minimum-digits path: %.<n>e for the smallest n such that\n            // round-tripping recovers d. For the common test262 cases this is\n            // the same shape Double.toString produces, then we canonicalize.\n            formatted = String.format(java.util.Locale.ROOT, \"%.15e\", d);\n            // Trim trailing zeros from the mantissa fractional part.\n            int e = formatted.indexOf('e');\n            String mant = formatted.substring(0, e);\n            String exp = formatted.substring(e);\n            if (mant.contains(\".\")) {\n                mant = mant.replaceAll(\"0+$\", \"\");\n                if (mant.endsWith(\".\")) mant = mant.substring(0, mant.length() - 1);\n            }\n            formatted = mant + exp;\n        } else {\n            formatted = String.format(java.util.Locale.ROOT, \"%.\" + digits + \"e\", d);","sourceCodeStart":163,"sourceCodeEnd":199,"githubUrl":"https://github.com/karatelabs/karate/blob/a22eb90246d958d15a47bf436693d0121ad2812d/karate-js/src/main/java/io/karatelabs/js/JsNumberPrototype.java#L163-L199","documentation":"Number.prototype.toExponential accepts fractionDigits in the range 0–100 in this engine (spec max is 100). A provided (non-undefined) digit count outside that range raises a RangeError before any formatting.","triggerScenarios":"Calling n.toExponential(d) with d < 0 or d > 100, typically a computed or misremembered digit count; passing -1 intending 'auto'.","commonSituations":"Porting from toPrecision (whose floor is 1) or other engines; dynamically derived digit counts; typos like toExponential(-1).","solutions":["Clamp digits to 0–100 before calling","Use 0 or omit the argument for automatic minimum digits","Switch to toPrecision if 1+ significant digits were intended"],"exampleFix":"// before\nvar s = n.toExponential(-1);\n// after\nvar s = n.toExponential(Math.min(100, Math.max(0, d)));","handlingStrategy":"validation","validationCode":"if (d != null && (d < 0 || d > 100)) throw new RangeError('fractionDigits must be 0..100');","typeGuard":"function isValidFractionDigits(d) { return d == null || (typeof d === 'number' && Number.isInteger(d) && d >= 0 && d <= 100); }","tryCatchPattern":"try { s = n.toExponential(d); } catch (e) { if (e instanceof RangeError) { s = n.toExponential(Math.min(100, Math.max(0, d))); } else { throw e; } }","preventionTips":["Clamp computed digit counts to 0–100","Use undefined (not -1) for automatic digit selection","Note the 0 floor differs from toPrecision's 1"],"tags":["javascript","rangeerror","karate-js","number-formatting"],"backgroundTag":"value-out-of-range","analyzedSha":"a22eb90246d958d15a47bf436693d0121ad2812d","analyzedAt":"2026-09-12T09:01:00.220Z","contentChangedAt":"2026-09-12T09:01:00.220Z","schemaVersion":2},"datasetVersion":"2026-09-16T19:17:19.609Z"}