Rumah >hujung hadapan web >tutorial js >Peruntukan Tepat dengan Big.js: Mengendalikan Pembundaran dan Pengagihan Semula Sisa
Apabila berurusan dengan peruntukan pecahan dalam jumlah yang besar, ralat pembundaran dan sisa pengagihan semula menjadi cabaran yang ketara. Masalah ini tidak terhad kepada pengiraan kewangan; ia boleh berlaku dalam domain lain seperti pengagihan sumber, penjadualan tugas atau peruntukan belanjawan. Dalam artikel ini, kami menunjukkan kaedah yang disahkan dan diuji menggunakan perpustakaan big.js dalam JavaScript untuk mencapai peruntukan yang tepat sambil mengendalikan pembundaran dan pengagihan semula sisa dengan berkesan.
Bayangkan senario di mana anda perlu memperuntukkan jumlah wang yang sangat besar di antara pelbagai saham berdasarkan peratusan masing-masing. Contohnya:
Syaratnya ialah:
Menggunakan perpustakaan big.js, kami boleh menangani cabaran ini dengan aritmetik ketepatan arbitrari. Inilah penyelesaian lengkapnya:
const Big = require("big.js"); function allocateMoney(amount, allocations) { // Step 1: Convert percentages to rational numbers let totalPercent = new Big(0); for (let key in allocations) { totalPercent = totalPercent.plus(new Big(allocations[key])); } const allocationRatios = {}; for (let key in allocations) { allocationRatios[key] = new Big(allocations[key]).div(totalPercent); }
Tukar jumlah amaun kepada sen dan lakukan pembundaran awal:
const totalCents = new Big(amount).times(100).toFixed(0); // Convert amount to cents const allocatedCents = {}; for (let key in allocationRatios) { allocatedCents[key] = allocationRatios[key].times(totalCents).toFixed(0, 0); // Convert to int (round down) }
Kira baki sen dan agihkannya secara saksama berdasarkan baki pecahan:
let distributedTotal = new Big(0); for (let key in allocatedCents) { distributedTotal = distributedTotal.plus(new Big(allocatedCents[key])); } const remainingCents = new Big(totalCents).minus(distributedTotal).toFixed(0); // Sort allocations by fractional remainder descending for redistribution const fractionalRemainders = {}; for (let key in allocationRatios) { const allocated = allocationRatios[key].times(totalCents); const fractionalPart = allocated.minus(allocated.toFixed(0)); fractionalRemainders[key] = fractionalPart; } const sortedKeys = Object.keys(fractionalRemainders).sort((a, b) => { if (fractionalRemainders[b].gt(fractionalRemainders[a])) { return 1; } if (fractionalRemainders[b].lt(fractionalRemainders[a])) { return -1; } return 0; }); for (let i = 0; i < remainingCents; i++) { const key = sortedKeys[i % sortedKeys.length]; allocatedCents[key] = new Big(allocatedCents[key]).plus(1).toFixed(0); }
Akhir sekali, tukarkan semula peruntukan kepada dolar:
const allocatedDollars = {}; for (let key in allocatedCents) { allocatedDollars[key] = new Big(allocatedCents[key]).div(100).toFixed(2); // Convert cents to dollars with 2 decimals } return allocatedDollars; }
Begini cara anda boleh menggunakan fungsi allocateMoney untuk memperuntukkan dana antara saham:
const totalAmount = "1234567890123456.78"; // A very large total amount const stockAllocations = { "Stock A": "50.5", // 50.5% "Stock B": "30.3", // 30.3% "Stock C": "19.2", // 19.2% }; const result = allocateMoney(totalAmount, stockAllocations); console.log("Allocation:"); console.log(result); // Calculate total allocated let totalAllocated = new Big(0); for (let key in result) { totalAllocated = totalAllocated.plus(new Big(result[key])); } console.log(`Total Allocated: $${totalAllocated.toFixed(2)}`);
Untuk input yang diberikan, outputnya ialah:
Allocation: { 'Stock A': '623456784512345.67', 'Stock B': '374074070707407.41', 'Stock C': '237037034903703.70' } Total Allocated: 34567890123456.78
Aritmetik Tepat dengan big.js:
Pustaka big.js memastikan ketepatan dengan mengelakkan ralat titik terapung.
Kendalikan Sisa Makanan Secara Adil:
Gunakan baki pecahan untuk mengagihkan unit sisa secara deterministik dan saksama.
Selaraskan Jumlah:
Selepas semua pelarasan, pastikan jumlah peruntukan sepadan dengan jumlah asal.
Boleh Skala untuk Nilai Besar:
Pendekatan ini berfungsi dengan lancar untuk jumlah yang sangat besar, menjadikannya sesuai untuk masalah peruntukan kewangan dan sumber.
Dengan mengikuti kaedah ini, anda boleh mencapai peruntukan yang tepat dan saksama dalam sebarang senario yang memerlukan ketepatan berangka yang tinggi.
Atas ialah kandungan terperinci Peruntukan Tepat dengan Big.js: Mengendalikan Pembundaran dan Pengagihan Semula Sisa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!