Rumah >pembangunan bahagian belakang >tutorial php >Mengendalikan Pengiraan Perpuluhan dalam PHP dengan API Objek BCMath Baharu
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.
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:
Walaupun berkemungkinan lebih perlahan daripada FLOAT
, kelebihan ketepatan mengatasi perbezaan prestasi dalam sistem kritikal misi.
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:
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>
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 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:
Stringable
pelaksanaan antara muka.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>
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!