Rumah >pembangunan bahagian belakang >tutorial php >Mengendalikan Pengiraan Perpuluhan dalam PHP dengan API Objek BCMath Baharu

Mengendalikan Pengiraan Perpuluhan dalam PHP dengan API Objek BCMath Baharu

Patricia Arquette
Patricia Arquetteasal
2025-01-23 12:04:11858semak imbas

Handling Decimal Calculations in PHP  with the New BCMath Object API

Asal diterbitkan di Blog Takeshi Yu.


Pengiraan berangka yang tepat adalah penting dalam aplikasi perusahaan, terutamanya yang berkaitan dengan kewangan, perakaunan atau inventori. Malah ralat pembundaran kecil boleh menyebabkan masalah yang ketara. API Objek BCMath PHP 8.4 yang dipertingkatkan menawarkan penyelesaian yang diperhalusi untuk pengiraan perpuluhan yang tepat dan cekap.


Pembangun PHP yang berpengalaman biasa dengan ketepatan titik terapung:

<code class="language-php">$a = 0.1;
$b = 0.2;
var_dump($a + $b);  // Outputs: 0.30000000000000004</code>

Ketidaktepatan ini tidak boleh diterima dalam konteks kewangan. Ralat kecil ini terkumpul, membawa kepada percanggahan dunia sebenar.

Reka Bentuk Pangkalan Data untuk Ketepatan

Pengiraan perpuluhan yang tepat bermula dengan pangkalan data. Jenis DECIMAL adalah penting:

<code class="language-php">// In Laravel Migration
Schema::create('items', function (Blueprint $table) {
    $table->id();
    $table->decimal('quantity', 10, 3);  // Precision: 10 digits, 3 decimal places
    $table->decimal('price', 10, 3);     // Precision: 10 digits, 3 decimal places
    $table->decimal('discount', 10, 3);  // Precision: 10 digits, 3 decimal places
    $table->decimal('tax', 10, 3);       // Precision: 10 digits, 3 decimal places
    // ... other columns
});</code>

DECIMAL memastikan:

  • Ketepatan perpuluhan yang tepat.
  • Skala dan ketepatan yang boleh disesuaikan.
  • Kesesuaian untuk aplikasi kewangan.

Walaupun berkemungkinan lebih perlahan daripada FLOAT, kelebihan ketepatan mengatasi perbezaan prestasi dalam sistem kritikal misi.

Memanfaatkan Casting Laravel

Laravel memudahkan pengendalian perpuluhan dengan sistem pemutusnya:

<code class="language-php">class Item extends Model
{
    protected $casts = [
        'quantity' => 'decimal:3',
        'price' => 'decimal:3',
        'discount' => 'decimal:3',
        'tax' => 'decimal:3',
    ];
}</code>

Walau bagaimanapun, ingat bahawa pemutus Laravel terutamanya mengurus:

  • Pemformatan data.
  • Perwakilan nilai yang konsisten.

Mengelakkan Perangkap Penukaran Jenis

Walaupun dengan jenis pangkalan data yang betul dan penghantaran Laravel, ralat pengiraan boleh berlaku:

<code class="language-php">// Database values
$item1 = Item::find(1);  // price: "99.99"
$item2 = Item::find(2);  // price: "149.99"

// Calculation without BCMath
$subtotal = $item1->price + $item2->price;
$tax = $subtotal * 0.05;  // 5% tax

var_dump($tax);  // Outputs: float(12.499000000000002) instead of 12.499</code>

Ini berlaku kerana PHP secara tersirat menukar rentetan kepada nombor semasa aritmetik:

<code class="language-php">// String values from database
$price1 = "99.99";
$price2 = "149.99";
echo gettype($price1);  // string

// Implicit conversion to float
$total = $price1 + $price2;
echo gettype($total);   // double (float)</code>

BCMath Sebelum PHP 8.4: Tepat tetapi Membosankan

Pelanjutan BCMath tradisional memberikan ketepatan:

<code class="language-php">// Database values
$item1 = Item::find(1);  // price: "99.99"
$item2 = Item::find(2);  // price: "149.99"

// Using BCMath functions
$subtotal = bcadd($item1->price, $item2->price, 3);
$tax = bcmul($subtotal, $item2->tax, 3);

var_dump($tax);  // Precisely outputs: string(5) "12.499"</code>

Walau bagaimanapun, pengiraan yang rumit menjadi bertele-tele dan kurang boleh diselenggara:

<code class="language-php">// Complex order calculation (using BCMath functions)
// ... (code omitted for brevity)</code>

API Objek BCMath PHP 8.4: Keanggunan dan Ketepatan

API BCMath berorientasikan objek PHP 8.4 memudahkan pengiraan tepat:

<code class="language-php">use BCMath\Number;

$item1 = Item::find(1);
$price = new Number($item1->price);
$quantity = new Number($item1->quantity);
$discountRate = new Number($item1->discount);
$taxRate = new Number($item1->tax);

// Natural and readable calculations
$subtotal = $price * $quantity;
$discount = $subtotal * $discountRate;
$afterDiscount = $subtotal - $discount;
$tax = $afterDiscount * $taxRate;
$total = $afterDiscount + $tax;

var_dump($total);  // Automatically converts to string</code>

Kelebihan API baharu:

  • Reka bentuk berorientasikan objek intuitif.
  • Sokongan pengendali matematik standard.
  • Objek tidak berubah untuk integriti data.
  • Stringable pelaksanaan antara muka.

Integrasi Laravel yang Lancar

Keanggunan lebih lanjut dicapai dengan aksesori Laravel:

<code class="language-php">use BCMath\Number;

class Item extends Model
{
    // ... (accessor methods for quantity, price, discount, tax using Number) ...
}</code>

Atau dengan pelakon tersuai:

<code class="language-php">// ... (DecimalCast class implementation) ...</code>

Kemudian:

<code class="language-php">$item1 = Item::find(1);

$subtotal = $item1->price * $item1->quantity;
// ... (rest of the calculation) ...</code>

Kesimpulan

Dalam pengurusan inventori penjagaan kesihatan, pengiraan perpuluhan yang tepat adalah penting. API Objek BCMath PHP 8.4, disepadukan dengan Laravel, meningkatkan pengendalian pengiraan ini dengan ketara, menawarkan ketepatan, kebolehbacaan, kebolehselenggaraan dan keselamatan jenis. Walaupun fungsi BCMath yang lebih lama memenuhi tujuannya, pendekatan baharu ini menyelaraskan pembangunan dengan ketara.

Atas ialah kandungan terperinci Mengendalikan Pengiraan Perpuluhan dalam PHP dengan API Objek BCMath Baharu. 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
Artikel sebelumnya:Modul AI DrupalArtikel seterusnya:Modul AI Drupal