更新(2021 年 1 月)
根据其范围,javascript 中的数字可能会以科学记数法显示。例如,如果您在控制台中键入 0.0000001,您可能会看到它是 1e-7,而 0.000001 看起来没有变化 (0.000001)。如果您的应用程序处理一系列不涉及科学记数法的数字,您可以忽略此更新并使用下面的原始答案。 
此更新是关于添加一个函数来检查数字是否为科学格式,如果是,则将其转换为十进制格式。在这里,我提出这一个,但你可以使用能实现相同的目标,根据您的应用程序需要的任何其他功能:
function toFixed(x) {
  if (Math.abs(x) < 1.0) {
    var e = parseInt(x.toString().split('e-')[1]);
    if (e) {
        x *= Math.pow(10,e-1);
        x = '0.' + (new Array(e)).join('0') + x.toString().substring(2);
    }
  } else {
    var e = parseInt(x.toString().split('+')[1]);
    if (e > 20) {
        e -= 20;
        x /= Math.pow(10,e);
        x += (new Array(e+1)).join('0');
    }
  }
  return x;
}
现在只需将该函数应用于参数(这是相对于原始答案的唯一更改):
function toFixedTrunc(x, n) {
      x = toFixed(x) 
      // From here on the code is the same than the original answer
      const v = (typeof x === 'string' ? x : x.toString()).split('.');
      if (n <= 0) return v[0];
      let f = v[1] || '';
      if (f.length > n) return `${v[0]}.${f.substr(0,n)}`;
      while (f.length < n) f += '0';
      return `${v[0]}.${f}`
    }
此更新版本还解决了评论中提到的一个案例:
toFixedTrunc(0.000000199, 2) => "0.00" 
同样,选择最适合您的应用程序需求的内容。
原始答案(2017 年 10 月)
对于任何 n≥0,将数字截断(不四舍五入)为第 n 个十进制数字并将其转换为具有恰好 n 个十进制数字的字符串的通用解决方案。
function toFixedTrunc(x, n) {
  const v = (typeof x === 'string' ? x : x.toString()).split('.');
  if (n <= 0) return v[0];
  let f = v[1] || '';
  if (f.length > n) return `${v[0]}.${f.substr(0,n)}`;
  while (f.length < n) f += '0';
  return `${v[0]}.${f}`
}
其中 x 可以是数字(转换为字符串)或字符串。
以下是 n=2 的一些测试(包括 OP 要求的测试):
0           => 0.00
0.01        => 0.01
0.5839      => 0.58
0.999       => 0.99
1.01        => 1.01
2           => 2.00
2.551       => 2.55
2.99999     => 2.99
4.27        => 4.27
15.7784514  => 15.77
123.5999    => 123.59
对于 n 的其他一些值:
15.001097   => 15.0010 (n=4)
0.000003298 => 0.0000032 (n=7)
0.000003298257899 => 0.000003298257 (n=12)