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
开始,以便在做任何其他事情之前去掉小数部分。
这种工作方式也可能会失效,但您必须使用一些极端的数字才能实现。
我正在尝试计算美元金额的百分比费用。我尝试了很多方法,但四舍五入似乎不对。有计算费用的标准或最佳做法吗?
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
开始,以便在做任何其他事情之前去掉小数部分。
这种工作方式也可能会失效,但您必须使用一些极端的数字才能实现。