{"record":{"id":"ad8f0d5404a48c7c","repo":"n8n-io/n8n","slug":"isodd-is-only-callable-on-integers","errorCode":null,"errorMessage":"isOdd() is only callable on integers","messagePattern":"isOdd\\(\\) is only callable on integers","errorType":"exception","errorClass":"ExpressionExtensionError","httpStatus":null,"severity":"error","filePath":"packages/@n8n/expression-runtime/src/extensions/number-extensions.ts","lineNumber":32,"sourceCode":"\t];\n\n\ttry {\n\t\treturn value.toLocaleString(locales as string, config);\n\t} catch {\n\t\treturn String(value);\n\t}\n}\n\nfunction isEven(value: number) {\n\tif (!Number.isInteger(value)) {\n\t\tthrow new ExpressionExtensionError('isEven() is only callable on integers');\n\t}\n\treturn value % 2 === 0;\n}\n\nfunction isOdd(value: number) {\n\tif (!Number.isInteger(value)) {\n\t\tthrow new ExpressionExtensionError('isOdd() is only callable on integers');\n\t}\n\treturn Math.abs(value) % 2 === 1;\n}\n\nfunction floor(value: number) {\n\treturn Math.floor(value);\n}\n\nfunction ceil(value: number) {\n\treturn Math.ceil(value);\n}\n\nfunction abs(value: number) {\n\treturn Math.abs(value);\n}\n\nfunction isInteger(value: number) {\n\treturn Number.isInteger(value);","sourceCodeStart":14,"sourceCodeEnd":50,"githubUrl":"https://github.com/n8n-io/n8n/blob/5ac6606e81f67bb9534255570cd4e86fd8101eee/packages/@n8n/expression-runtime/src/extensions/number-extensions.ts#L14-L50","documentation":"`isOdd(value)` mirrors `isEven`: it requires `Number.isInteger(value)`. Non-integers (including NaN and Infinity) throw. Note the body uses `Math.abs(value) % 2 === 1` so the integer check is mandatory before the modulo.","triggerScenarios":"`.isOdd()` on `2.7`, on `NaN`, or on a value that arrived as a float from upstream.","commonSituations":"Fractional result from a prior computation; a parsed float where an integer was expected; rounding was skipped.","solutions":["Round first: `.floor().isOdd()` or `.toInt().isOdd()`.","Validate integrality upstream before the expression runs.","Re-check the upstream node's output type."],"exampleFix":"// before\n{{ $json.score.isOdd() }}\n// after\n{{ $json.score.floor().isOdd() }}","handlingStrategy":"type-guard","validationCode":"if (!Number.isInteger($json.n)) {\n  throw new Error('isOdd(): value must be an integer, got ' + $json.n);\n}\nreturn $json;","typeGuard":"const isInteger = (v: unknown): v is number => typeof v === 'number' && Number.isInteger(v);","tryCatchPattern":null,"preventionTips":["Round first: `.floor().isOdd()`.","Validate integrality upstream.","Re-check the upstream node's output type."],"tags":["expression","number","integer","type-mismatch"],"backgroundTag":null,"analyzedSha":"5ac6606e81f67bb9534255570cd4e86fd8101eee","analyzedAt":"2026-08-12T05:26:35.080Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}