如何使用toFixed方法动态裁剪小数后的小数位而不进行舍入

5uzkadbs  于 2022-10-15  发布在  React
关注(0)|答案(2)|浏览(340)

我正在试图找到一个解决方案,但似乎没有堆栈溢出的情况下,小数精度需要是动态的。因此,我正在创建一个Reaction密码项目,并试图使其能够动态删除小数位后的数字。这就是我的意思。
我目前正在动态渲染精度,如下所示:

const precision = pairType === 'base' ? selectedBaseCurrencyObj.precision.amount : selectedBaseCurrencyObj.precision.cost;
 Number(assetObj.freeTotal).toFixed(precision)

‘精度’是动态的,将从我创建的稍后的API中返回。现在,我在Stackoverflow上搜索了所有内容,尝试在不对数字进行四舍五入的情况下实现这一点。想知道是否有一种简单的方法可以用其他的js方法把图的其余部分剪掉,这也不会阻止它的舍入。

gpfsuwkq

gpfsuwkq1#

如果它只是关于截断特定长度的某个数字的尾数,那么可以使用Math.trunc方法轻松完成:

const truncate = (n, precision) => {
    const f = Math.pow(10, Math.max(precision | 0, 0)) * 10;
    return Math.trunc(n * f) / f;
};

console.log(truncate(1234.56789, 0));
console.log(truncate(1234.56789, 3));
console.log(truncate(1234.56789, 6));

但是,如果它是关于模仿toFixed方法,同时避免舍入,那么它就更难了:

const toFixed = (n, precision) => {
    const s = `${n}`, i = `${n}`.split('.'), p = Math.max(precision | 0, 0);
    return i[0] + (p ? `.${(i[1] ?? '').padEnd(p, '0')}`.slice(0, p + 1) : '');
};

console.log(toFixed(1234.56789, 0), (1234.56789).toFixed(0));
console.log(toFixed(1234.56789, 3), (1234.56789).toFixed(3));
console.log(toFixed(1234.56789, 6), (1234.56789).toFixed(6));
oaxa6hgo

oaxa6hgo2#

您可以将输入的数字转换为字符串,用“”将其拆分。然后返回数组的第一个元素和第二个元素的一部分,最后转换回数字
示例:

let num = 23.987654321

const trimDecimalWithPrecision = (num, precision) => {
  var splittedNum = num.toString().split(".")
  if(precision === 0 || !num.toString().includes(".")) return Number(splittedNum[0])
  else {
    return Number(splittedNum[0] + "." + splittedNum[1].substring(0, precision))
  }
}

console.log(trimDecimalWithPrecision(num, 0)) // Output => 23
console.log(trimDecimalWithPrecision(num, 1)) // Output => 23.9
console.log(trimDecimalWithPrecision(num, 2)) // Output => 23.98
console.log(trimDecimalWithPrecision(num, 3)) // Output => 23.987
console.log(trimDecimalWithPrecision(num, 4)) // Output => 23.9876

因此,在您的情况下,您希望拥有:

const trimDecimalWithPrecision = (num, precision) => {
  var splittedNum = num.toString().split(".")
  if(precision === 0 || !num.toString().includes(".")) return Number(splittedNum[0])
  else {
    return Number(splittedNum[0] + "." + splittedNum[1].substring(0, precision))
  }
}

const precision = pairType === 'base' ? selectedBaseCurrencyObj.precision.amount : selectedBaseCurrencyObj.precision.cost;
trimDecimalWithPrecision(assetObj.freeTotal, precision)

编辑:添加了要运行的代码片断的console.log

相关问题