pure mathematic, just for decimal number negative and positive:
but .tofixed() seems to be bugged:
just fyi: for a decimal number +/-, 0.xxxxxx Math.floor(-Math.abs(Math.log(n))/Math/log(0)) gives the position of first digit non zero after dot
function formatNumber(n) {
  console.log(n + " -> " + n.toFixed(-Math.floor(Math.log(Math.abs(n)) / Math.log(10))));
  return n.toFixed(-Math.floor(Math.log(Math.abs(n)) / Math.log(10)))
}
// You test cases
formatNumber(0.0001)
formatNumber(0.2453535)
formatNumber(0.55)
formatNumber(0.055)
formatNumber(0.0055)
formatNumber(0.15)
formatNumber(0.015)
formatNumber(0.0015)
formatNumber(0.25)
formatNumber(0.025)
formatNumber(0.0025)
formatNumber(0.00412)
// Negative numbers
formatNumber(-0.0045)
// Negative numbers
//console.log(formatNumber(-2.01))
formatNumber(-0.0045)
formatNumber(-0.55)
formatNumber(-0.15)
formatNumber(-0.015)
// Non float numbers
//console.log(formatNumber(4))
//console.log(formatNumber(102))
// The 0.011 case mentionned in comments
formatNumber(0.0105)
 
 
result:
0.0001 -> 0.0001
0.2453535 -> 0.2
0.55 -> 0.6
0.055 -> 0.06
0.0055 -> 0.005   bugged
0.15 -> 0.1       bugged
0.015 -> 0.01     bugged
0.0015 -> 0.002
0.25 -> 0.3
0.025 -> 0.03
0.0025 -> 0.003
0.00412 -> 0.004
-0.0045 -> -0.004
-0.0045 -> -0.004
-0.55 -> -0.6     bugged
-0.15 -> -0.1 
-0.015 -> -0.01
0.0105 -> 0.01
so like toFixed() is bugged,  another solution with regex:
i use this regex to trap the number:   /\.(0*)([^0])([0-9])\d*/
function formatNumber(n) {
  v = n.toString().replace(/\.(0*)([^0])([0-9])\d*/, (g1, g2, g3, g4) => {
    return "." + g2 + (+g4 < 5 ? +g3 : +g3 + 1);
  });
  return +v;
}
Explanation:
g1 is the full match string
\. dot not selected following by
(0*)   g2 = "" or lot "0" following by
([^0])  g3 = one digit but not 0 following by
([0-9])  g4 = one digit following by
\d*  any digit not selected which finish the number
The full solution for any number:
function formatNumber(n) {
  v = n.toString().replace(/\.(0*)([^0])([0-9])\d*/, (g1, g2, g3, g4) => {
    return "." + g2 + (+g4 < 5 ? +g3 : +g3 + 1);
  });
  return +v;
}
test=[0.0001, 0.2453535 , 0.2553535, 
0.5, 0.055, 0.0055, 0.15, 0.015, 0.0015,
0.25, 0.025, 0.0025 , 0.00412, -0.0045, 
-2.01, -0.016 , -0.012, -0.0045, -0.055, 
-0.15, -0.015, -4, 102, 0.0105, 2.00015, -4.026];
resultwaiting=[0.0001, 0.2 , 0.3, 
0.5, 0.06, 0.006, 0.2, 0.02, 0.002,
0.3, 0.03, 0.003 , 0.004, -0.005, 
-2.01, -0.02 , -0.01, -0.005, -0.06, 
-0.2, -0.02, -4, 102, 0.01, 2.0002, -4.03];
var i =0;
test.forEach(x => console.log(x, formatNumber(x), formatNumber(x) == resultwaiting[i++] ))