我有一個函式來計算交易費用的百分比。為了測驗它,我寫了下面這個函式,以確保費率計算的準確性。然而,計算出的費率(1 - part/whole) * 100與傳遞給函式的實際費率有微小的偏差。
是否有辦法糾正這個錯誤,并確保rate ===計算出的比率?
P.S: 四舍五入到一個固定的小數位不會解決這個問題,因為比率可以有不同的小數位。
const getAmount = (amount, rate)=> {
const fee = amount * (rate / 100) 。
const amountAfterFee = amount - fee;
const calculatedRate = (1 - amountAfterFee / amount) * 100;
return { amount, fee, amountAfterFee, rate, calculatedRate };
};
console.log(getAmount(3000, 5) )。)
// { amount: 3000, fee: 150, amountAfterFee: 2850, rate: 5, calculatedRate: 5.000000000000004 }
console.log(getAmount(3000, 6.0) )。)
// { amount: 3000, fee: 180, amountAfterFee: 2820, rate: 6, calculatedRate: 6.000000000000005 }
console.log(getAmount(3000, 7.3) )。)
// { amount: 3000, fee: 219, amountAfterFee: 2781, rate: 7.3, calculatedRate: 7.299999999999995 }
console.log(getAmount(3000, 8.12345) )。)
// { amount: 3000, fee: 243.7035, amountAfterFee: 2756.2965, rate: 8.12345, calculatedRate: 8.1234499999998 }
uj5u.com熱心網友回復:
你正在使用浮點運算來進行計算。由于它們的內部表示法,可能會出現精度問題,例如你所面臨的問題。請參閱該鏈接以了解更多詳細資訊。
綜上所述,由于您似乎要處理貨幣計算,您的最佳選擇是使用特定的資料型別,而不是浮動資料,例如currency.js:
。const m = (amount) => currency(a amount, { precision: 10 })
const getAmount = (amount, rate)=> {
const fee = m(a amount). multiply(m(rate).divide(100) )。
const amountAfterFee = m(金額).減去(費用);
const calculatedRate = m(1).subtract( amountAfterFee. divide(amount)).multiply(100) 。
return { amount, fee, amountAfterFee, rate, calculatedRate };
};
console.log(getAmount(3000, "5") )。)
// { amount: 3000, fee: 150, amountAfterFee: 2850, rate: 5, calculatedRate: 5.000000000000004 }
console.log(getAmount(3000, "6.0") )。)
// { amount: 3000, fee: 180, amountAfterFee: 2820, rate: 6, calculatedRate: 6.000000000000005 }
console.log(getAmount(3000, "7.3") )。
// { amount: 3000, fee: 219, amountAfterFee: 2781, rate: 7.3, calculatedRate: 7.299999999999995 }
console.log(getAmount(3000, "8.12345") )。)
// { amount: 3000, fee: 243.7035, amountAfterFee: 2756.2965, rate: 8.12345, calculatedRate: 8.123449999999998 }
<script src="https://cdn. jsdelivr.net/npm/currency.js"></script>
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
自然,還有其他可用的選項,例如dinero.js。哪一個更適合你取決于你的具體情況,一如既往。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/319965.html
標籤:
上一篇:沿著一條線均勻地分布N個點
