BabylonJS/Babylon.js · error

precision must be a finite number greater than 0.

Error message

precision must be a finite number greater than 0.

What it means

Thrown by the 'screenshot' command when args.precision is supplied but Number(args.precision) is NaN/Infinity or <= 0. Precision controls screenshot output quality and must be a finite positive number (default is 1 when omitted).

Source

Thrown at packages/dev/inspector-v2/src/services/cli/screenshotCommandService.ts:69

                    const cameraId = parseInt(args.cameraUniqueId, 10);
                    if (isNaN(cameraId)) {
                        throw new Error("cameraUniqueId must be a number.");
                    }
                    camera = scene.cameras.find((c) => c.uniqueId === cameraId);
                    if (!camera) {
                        throw new Error(`No camera found with uniqueId ${cameraId}.`);
                    }
                } else {
                    camera = scene.frameGraph ? FrameGraphUtils.FindMainCamera(scene.frameGraph) : scene.activeCamera;
                }

                if (!camera) {
                    throw new Error("No camera available for screenshot.");
                }

                const precision = args.precision !== undefined ? Number(args.precision) : 1;
                if (!Number.isFinite(precision) || precision <= 0) {
                    throw new Error("precision must be a finite number greater than 0.");
                }

                let width: number | undefined;
                if (args.width !== undefined) {
                    width = Number(args.width);
                    if (!Number.isFinite(width) || width <= 0 || !Number.isInteger(width)) {
                        throw new Error("width must be a finite positive integer.");
                    }
                }

                let height: number | undefined;
                if (args.height !== undefined) {
                    height = Number(args.height);
                    if (!Number.isFinite(height) || height <= 0 || !Number.isInteger(height)) {
                        throw new Error("height must be a finite positive integer.");
                    }
                }
                const screenshotSize = width !== undefined && height !== undefined ? { width, height, precision } : { precision };

View on GitHub (pinned to 0592b347b8)

Solutions

  1. Pass precision as a positive finite number, e.g. precision: 1 (default) or 0.5 for half quality.
  2. Omit precision to use the default value of 1.
  3. Convert/strip units in scripts before passing (e.g. 90 → 0.9).

Example fix

// before
await execute("screenshot", { precision: "90%" });
// after
await execute("screenshot", { precision: 0.9 });
Defensive patterns

Strategy: validation

Validate before calling

if (args.precision !== undefined) {
  const p = Number(args.precision);
  if (!Number.isFinite(p) || p <= 0) throw new RangeError(`precision must be a finite number > 0, got: ${args.precision}`);
}

Type guard

function isValidPrecision(v: unknown): v is number { return typeof v === "number" && Number.isFinite(v) && v > 0; }

Try / catch

try {
  await screenshot({ precision });
} catch (e) {
  if (e instanceof Error && e.message.startsWith("precision must be")) {
    return screenshot({}); // omit to use default precision 1
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling screenshot with precision="abc", 0, -2, Infinity, or any value that fails Number.isFinite(precision) && precision > 0.

Common situations: Passing percentage strings like "90%" (Number gives NaN); passing 0 expecting 'auto'; unit confusion (passing 100 expecting percent where a multiplier is expected).

Related errors


AI-assisted analysis of BabylonJS/Babylon.js@0592b347b8 (2026-08-30). Data as JSON: /api/errors/21f68e5eb907036f. Report an issue: GitHub.