更新(2021年1月)
此次更新是关于添加一个检查数字是否为科学计数法的功能,并将其转换为十进制格式。在这里,我提出了这个方案,但您可以根据应用程序的需要使用任何其他实现相同目标的函数。
function toFixed(x) {
if (Math.abs(x) < 1.0) {
let 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 {
let 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)
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月)
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)
parseFloat
。它已经是一个浮点数,所以不需要解析它。那么,你最初是有一个string
还是一个number
? - user202729