Rumah >hujung hadapan web >tutorial js >Peruntukan Tepat dengan Big.js: Mengendalikan Pembundaran dan Pengagihan Semula Sisa

Peruntukan Tepat dengan Big.js: Mengendalikan Pembundaran dan Pengagihan Semula Sisa

Barbara Streisand
Barbara Streisandasal
2024-12-31 17:39:081048semak imbas

Precise Allocations with Big.js: Handling Rounding and Leftover Redistribution

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.


Masalah: Memperuntukkan Dana Antara Stok

Bayangkan senario di mana anda perlu memperuntukkan jumlah wang yang sangat besar di antara pelbagai saham berdasarkan peratusan masing-masing. Contohnya:

  • Stok A: 50.5%
  • Stok B: 30.3%
  • Stok C: 19.2%

Syaratnya ialah:

  • Lakukan pengiraan dalam sen untuk mengelakkan ralat titik terapung.
  • Agihkan baki sen secara adil selepas pembundaran awal.
  • Tukarkan kembali peruntukan akhir kepada dolar dengan dua tempat perpuluhan.

Penyelesaian

Menggunakan perpustakaan big.js, kami boleh menangani cabaran ini dengan aritmetik ketepatan arbitrari. Inilah penyelesaian lengkapnya:

1. Mulakan Input dan Tukar Peratusan kepada Nisbah

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);
  }

2. Kira Peruntukan Awal dalam Sen

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)
  }

3. Agihkan Semula Baki Sen

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);
  }

4. Tukar Kembali kepada Dolar

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;
}

Contoh Penggunaan

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)}`);

Output untuk Contoh

Untuk input yang diberikan, outputnya ialah:

Allocation:
{
  'Stock A': '623456784512345.67',
  'Stock B': '374074070707407.41',
  'Stock C': '237037034903703.70'
}
Total Allocated: 34567890123456.78

Pengambilan Utama

  1. Aritmetik Tepat dengan big.js:
    Pustaka big.js memastikan ketepatan dengan mengelakkan ralat titik terapung.

  2. Kendalikan Sisa Makanan Secara Adil:
    Gunakan baki pecahan untuk mengagihkan unit sisa secara deterministik dan saksama.

  3. Selaraskan Jumlah:
    Selepas semua pelarasan, pastikan jumlah peruntukan sepadan dengan jumlah asal.

  4. 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn