{"id":"b8897cbd14639411","repo":"jestjs/jest","slug":"precision-is-not-a-number","errorCode":null,"errorMessage":"Precision is not a Number","messagePattern":"Precision is not a Number","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/expect/src/asymmetricMatchers.ts","lineNumber":355,"sourceCode":"  toString() {\n    return `String${this.inverse ? 'Not' : ''}Matching`;\n  }\n\n  override getExpectedType() {\n    return 'string';\n  }\n}\n\nclass CloseTo extends AsymmetricMatcher<number> {\n  private readonly precision: number;\n\n  constructor(sample: number, precision = 2, inverse = false) {\n    if (!isA('Number', sample)) {\n      throw new Error('Expected is not a Number');\n    }\n\n    if (!isA('Number', precision)) {\n      throw new Error('Precision is not a Number');\n    }\n\n    super(sample);\n    this.inverse = inverse;\n    this.precision = precision;\n  }\n\n  asymmetricMatch(other: unknown) {\n    if (!isA<number>('Number', other)) {\n      return false;\n    }\n    let result = false;\n    if (\n      other === Number.POSITIVE_INFINITY &&\n      this.sample === Number.POSITIVE_INFINITY\n    ) {\n      result = true; // Infinity - Infinity is NaN\n    } else if (","sourceCodeStart":337,"sourceCodeEnd":373,"githubUrl":"https://github.com/jestjs/jest/blob/f49721c78e195558b40913977c9230f5b7f559d8/packages/expect/src/asymmetricMatchers.ts#L337-L373","documentation":"CloseTo's second constructor parameter is precision (default 2); it is validated with isA('Number', ...). closeTo compares numbers to a given number of decimal places, so a non-numeric precision has no meaning and throws at construction.","triggerScenarios":"Calling expect.closeTo(5, '2'), expect.closeTo(5, undefined), expect.closeTo(5, null), or expect.closeTo(5, {digits:2}). Omitting precision is fine (defaults to 2).","commonSituations":"Reading precision from config as a string; passing an options object instead of a number; forgetting that the 2nd arg is precision, not options.","solutions":["Pass a number for precision or omit it (defaults to 2): expect.closeTo(5) or expect.closeTo(5, 3).","Coerce validated config: expect.closeTo(5, Number(config.precision)).","Do not pass an options object — the signature is closeTo(expected, precision?)."],"exampleFix":"// before\nexpect(value).toEqual(expect.closeTo(5, { precision: 2 }));\n\n// after\nexpect(value).toEqual(expect.closeTo(5, 2));","handlingStrategy":"type-guard","validationCode":"if (precision !== undefined && typeof precision !== 'number' && !(precision instanceof Number)) {\n  throw new TypeError('expect.closeTo precision must be a number');\n}\nexpect.closeTo(sample, precision);","typeGuard":"function isPrecision(x: unknown): x is number {\n  return x === undefined || typeof x === 'number' || x instanceof Number;\n}","tryCatchPattern":"// constructor throws synchronously — validate precision (or omit it) before calling","preventionTips":["Omit precision to use the default of 2.","Do not pass an options object — the signature is closeTo(expected, precision?).","Coerce config-sourced precision with Number() after an isFinite check."],"tags":["expect","asymmetric-matcher","number","validation"],"analyzedSha":"f49721c78e195558b40913977c9230f5b7f559d8","analyzedAt":"2026-08-03T20:16:28.571Z","schemaVersion":2}