diff --git a/packages/vue-vuetify/src/controls/NumberControlRenderer.vue b/packages/vue-vuetify/src/controls/NumberControlRenderer.vue
index 872a522e3..9239b346c 100644
--- a/packages/vue-vuetify/src/controls/NumberControlRenderer.vue
+++ b/packages/vue-vuetify/src/controls/NumberControlRenderer.vue
@@ -75,16 +75,16 @@ const controlRenderer = defineComponent({
const options: any = this.appliedOptions;
return options.step ?? 0.1;
},
- precision(): number | undefined {
- if (!this.step || Number.isInteger(this.step)) return undefined;
- // Handle scientific notation and float imprecision
- const stepStr = this.step.toString();
- if (stepStr.indexOf('e-') > -1) {
- // Handle cases like 1e-3
- return parseInt(stepStr.split('e-')[1], 10);
+ precision(): number | null {
+ const options: any = this.appliedOptions;
+
+ // If precision is explicitly configured in the UI Schema options, respect it
+ if (options.precision !== undefined && options.precision !== null) {
+ return Number(options.precision);
}
- const fraction = stepStr.split('.')[1];
- return fraction ? fraction.length : undefined;
+
+ // Return null (not undefined) to allow Vuetify to accept any precision by default
+ return null;
},
value(): number | null | undefined {
if (
diff --git a/packages/vue-vuetify/tests/unit/controls/NumberControlRenderer.spec.ts b/packages/vue-vuetify/tests/unit/controls/NumberControlRenderer.spec.ts
index 0f76ffd83..3d2493a1b 100644
--- a/packages/vue-vuetify/tests/unit/controls/NumberControlRenderer.spec.ts
+++ b/packages/vue-vuetify/tests/unit/controls/NumberControlRenderer.spec.ts
@@ -57,3 +57,35 @@ describe('NumberControlRenderer.vue', () => {
expect(wrapper.html()).toMatchSnapshot();
});
});
+
+import { VNumberInput } from 'vuetify/components';
+
+describe('NumberControlRenderer precision logic', () => {
+ const renderers = [numberControlRendererEntry];
+ const schema = { type: 'number' };
+
+ beforeEach(() => {
+ clearAllIds();
+ });
+
+ it('allows unlimited precision by default (passes null to v-number-input)', () => {
+ const uischema = { type: 'Control', scope: '#' };
+ const wrapper = mountJsonForms(1.23456, schema, renderers, uischema);
+
+ const numberInput = wrapper.findComponent(VNumberInput);
+ // Vuetify requires null to remove precision limits
+ expect(numberInput.props('precision')).toBeNull();
+ });
+
+ it('respects explicitly configured precision via UI schema options', () => {
+ const uischema = {
+ type: 'Control',
+ scope: '#',
+ options: { precision: 3 }
+ };
+ const wrapper = mountJsonForms(1.23456, schema, renderers, uischema);
+
+ const numberInput = wrapper.findComponent(VNumberInput);
+ expect(numberInput.props('precision')).toBe(3);
+ });
+});
diff --git a/packages/vue-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap
index 0094a50bc..7e6bd2859 100644
--- a/packages/vue-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap
+++ b/packages/vue-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap
@@ -29,7 +29,7 @@ exports[`NumberControlRenderer.vue > should render component and match snapshot
-
+