diff --git a/EgwCoreLib.Razor/InputDouble.razor b/EgwCoreLib.Razor/InputDouble.razor
new file mode 100644
index 0000000..d4a6acd
--- /dev/null
+++ b/EgwCoreLib.Razor/InputDouble.razor
@@ -0,0 +1,65 @@
+@using System.Globalization
+
+
+
+@code {
+ ///
+ /// Actual bind value
+ ///
+ [Parameter]
+ public double Value { get; set; }
+
+ ///
+ /// Event for value changed
+ ///
+ [Parameter]
+ public EventCallback ValueChanged { get; set; }
+
+ ///
+ /// Number of decimal places to display
+ ///
+ [Parameter]
+ public int Decimals { get; set; } = 3;
+
+ ///
+ /// Step increment
+ ///
+ [Parameter]
+ public double Step { get; set; } = 0.001;
+
+ ///
+ /// Minimum value
+ ///
+ [Parameter]
+ public double? Min { get; set; }
+
+ ///
+ /// Maximum value
+ ///
+ [Parameter]
+ public double? Max { get; set; }
+
+ ///
+ /// CssClass for input component
+ ///
+ [Parameter]
+ public string CssClass { get; set; } = string.Empty;
+
+ private string FormattedValue => Value.ToString($"F{Decimals}", CultureInfo.InvariantCulture);
+
+ private async Task OnChange(ChangeEventArgs e)
+ {
+ if (double.TryParse(e.Value?.ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out var parsed))
+ {
+ var rounded = Math.Round(parsed, Decimals);
+ Value = rounded;
+ await ValueChanged.InvokeAsync(rounded);
+ }
+ }
+}