Javascript 固定,Math.round

Javascript toFixed, Math.round

我正在尝试计算美元金额的百分比费用。我尝试了很多方法,但四舍五入似乎不对。有计算费用的标准或最佳做法吗?

fee = 2.25 // %
total = 2

sFee = parseFloat(((fee / 100) * total).toFixed(2));
console.log(sFee)
// sFee is [=12=].04, should be [=12=].05

fee = 2.25 // %
total = 10

const x = (fee / 100) * total;
pFee = Math.round(x * 100) / 100;
console.log(pFee)

// this works with most numbers but when total is 10
// pFee is [=12=].22, should be [=12=].23

fee = 2.25 // %
total = 2

sFee = parseFloat(((fee / 100) * total + 0.00000000001).toFixed(2));
console.log(sFee)
// sFee is [=12=].05, 
// this seems to work best, not sure if it is the best solution.

浮点表示有其局限性,因此并非所有(中间)结果都是 100% 准确的。参见 Is floating point math broken?

为避免这种情况发生,请使用整数进行所有计算,首先将所有小数输入转换为整数,并且仅在计算结束时才转回小数并进行舍入。

使用这种方法,您的示例将如下所示:

var fee = 2.25
var total = 10

const pFee = Math.round((fee * 100) * total / 100) / 100;
console.log(pFee); // 0.23

所以这里的线索是从 fee * 100 开始,以便在做任何其他事情之前去掉小数部分。

这种工作方式也可能会失效,但您必须使用一些极端的数字才能实现。