diff -Nurpd a/scribus/ui/marginwidget.cpp b/scribus/ui/marginwidget.cpp
--- a/scribus/ui/marginwidget.cpp	2024-01-07 18:06:55.000000000 +0100
+++ b/scribus/ui/marginwidget.cpp	2024-01-10 21:32:10.800668530 +0100
@@ -143,6 +143,16 @@ MarginWidget::MarginWidget( QWidget* par
 		addTab(bleedPage, tr("Bleeds"));
 	}
 
+	topR->setSingleStep(unitGetSingleStepFromIndex(unitIndex, SC_BASE));
+	bottomR->setSingleStep(unitGetSingleStepFromIndex(unitIndex, SC_BASE));
+	leftR->setSingleStep(unitGetSingleStepFromIndex(unitIndex, SC_BASE));
+	rightR->setSingleStep(unitGetSingleStepFromIndex(unitIndex, SC_BASE));
+
+	BleedLeft->setSingleStep(unitGetSingleStepFromIndex(unitIndex, SC_BASE));
+	BleedRight->setSingleStep(unitGetSingleStepFromIndex(unitIndex, SC_BASE));
+	BleedTop->setSingleStep(unitGetSingleStepFromIndex(unitIndex, SC_BASE));
+	BleedBottom->setSingleStep(unitGetSingleStepFromIndex(unitIndex, SC_BASE));
+
 	// hints
 	topR->setToolTip( "<qt>" + tr( "Distance between the top margin guide and the edge of the page" ) + "</qt>");
 	bottomR->setToolTip( "<qt>" + tr( "Distance between the bottom margin guide and the edge of the page" ) + "</qt>");
@@ -354,6 +364,17 @@ void MarginWidget::setNewUnit(int newUni
 		connect(BleedTop, SIGNAL(valueChanged(double)), this, SLOT(changeBleeds()));
 		connect(BleedBottom, SIGNAL(valueChanged(double)), this, SLOT(changeBleeds()));
 	}
+
+	topR->setSingleStep(unitGetSingleStepFromIndex(newUnitIndex, SC_BASE));
+	bottomR->setSingleStep(unitGetSingleStepFromIndex(newUnitIndex, SC_BASE));
+	leftR->setSingleStep(unitGetSingleStepFromIndex(newUnitIndex, SC_BASE));
+	rightR->setSingleStep(unitGetSingleStepFromIndex(newUnitIndex, SC_BASE));
+
+	BleedLeft->setSingleStep(unitGetSingleStepFromIndex(newUnitIndex, SC_BASE));
+	BleedRight->setSingleStep(unitGetSingleStepFromIndex(newUnitIndex, SC_BASE));
+	BleedTop->setSingleStep(unitGetSingleStepFromIndex(newUnitIndex, SC_BASE));
+	BleedBottom->setSingleStep(unitGetSingleStepFromIndex(newUnitIndex, SC_BASE));
+
 	connect(topR, SIGNAL(valueChanged(double)), this, SLOT(setTop()));
 	connect(bottomR, SIGNAL(valueChanged(double)), this, SLOT(setBottom()));
 	connect(leftR, SIGNAL(valueChanged(double)), this, SLOT(setLeft()));
diff -Nurpd a/scribus/ui/scrspinbox.cpp b/scribus/ui/scrspinbox.cpp
--- a/scribus/ui/scrspinbox.cpp	2024-01-07 18:06:55.000000000 +0100
+++ b/scribus/ui/scrspinbox.cpp	2024-01-10 21:32:10.800668530 +0100
@@ -342,22 +342,22 @@ bool ScrSpinBox::eventFilter(QObject* wa
 		bool altB = wheelEvent->modifiers() & Qt::AltModifier;
 		if (shiftB && !altB)
 		{
-			setSingleStep(0.1);
+			setSingleStep(unitGetSingleStepFromIndex(m_unitIndex, SC_SMALL));
 			retval = QAbstractSpinBox::event(event);
 		} 
 		else if (!shiftB && altB)
 		{
-			setSingleStep(10.0);
+			setSingleStep(unitGetSingleStepFromIndex(m_unitIndex, SC_BIG));
 			retval = QAbstractSpinBox::event(event);
 		}
 		else if (shiftB && altB)
 		{
-			setSingleStep(0.01);
+			setSingleStep(unitGetSingleStepFromIndex(m_unitIndex, SC_TINY));
 			retval = QAbstractSpinBox::event(event);
 		}
 		else
 		{
-			setSingleStep(1.0);
+			setSingleStep(unitGetSingleStepFromIndex(m_unitIndex, SC_BASE));
 			retval = QAbstractSpinBox::event(event);
 		}
 		return retval;
diff -Nurpd a/scribus/units.cpp b/scribus/units.cpp
--- a/scribus/units.cpp	2024-01-07 18:07:07.000000000 +0100
+++ b/scribus/units.cpp	2024-01-10 21:33:23.273031234 +0100
@@ -28,6 +28,37 @@ for which a new license (GPL+exception)
 #include "units.h"
 
 /*!
+ * @brief Returns the SingleStep for the selected unit of measure.
+ */
+double SCRIBUS_API unitGetSingleStepFromIndex(const int index, const scMagnitude magnitude)
+{
+	double ret;
+
+	switch (index)
+	{
+		case SC_IN:
+			ret = 0.125;
+			switch (magnitude)
+			{
+				case SC_TINY:
+					ret /= 4;
+					break;
+				case SC_SMALL:
+					ret /= 2;
+					break;
+				case SC_BIG:
+					ret *= 8;
+					break;
+			}
+			break;
+		default:
+			ret = pow(10, magnitude);
+        }
+
+        return ret;
+}
+
+/*!
  * @brief Returns the ratio to points for the selected unit of measure. Ratios are for: PT, MM, IN, P, CM, C. DEG and PCT return 1.0 as they will never convert
  */
 double unitGetRatioFromIndex(const int index)
diff -Nurpd a/scribus/units.h b/scribus/units.h
--- a/scribus/units.h	2024-01-07 18:07:14.000000000 +0100
+++ b/scribus/units.h	2024-01-10 21:32:10.800668530 +0100
@@ -29,6 +29,14 @@ for which a new license (GPL+exception)
 #define UNITMIN 0
 #define UNITMAX 7
 
+// powers of ten used as index
+enum scMagnitude {
+	SC_TINY  = -2,
+	SC_SMALL = -1,
+	SC_BASE	 =  0,
+	SC_BIG   =  1
+};
+
 enum scUnit {
 	SC_POINTS      = 0,
 	SC_PT          = 0,
@@ -48,6 +56,7 @@ enum scUnit {
 	SC_PCT         = 7
 };
 
+double SCRIBUS_API unitGetSingleStepFromIndex(const int index, const scMagnitude magnitude);
 double SCRIBUS_API unitGetRatioFromIndex(const int index);
 int SCRIBUS_API unitGetBaseFromIndex(const int index);
 QString SCRIBUS_API unitGetStrFromIndex(const int index);
