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
Lepaskan: 2025-01-23 12:04:11
asal
958 orang telah melayarinya

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:

$a = 0.1;
$b = 0.2;
var_dump($a + $b);  // Outputs: 0.30000000000000004
Salin selepas log masuk

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:

// 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
});
Salin selepas log masuk

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:

class Item extends Model
{
    protected $casts = [
        'quantity' => 'decimal:3',
        'price' => 'decimal:3',
        'discount' => 'decimal:3',
        'tax' => 'decimal:3',
    ];
}
Salin selepas log masuk

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:

// 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
Salin selepas log masuk

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

// 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)
Salin selepas log masuk

BCMath Sebelum PHP 8.4: Tepat tetapi Membosankan

Pelanjutan BCMath tradisional memberikan ketepatan:

// 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"
Salin selepas log masuk

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

// Complex order calculation (using BCMath functions)
// ... (code omitted for brevity)
Salin selepas log masuk

API Objek BCMath PHP 8.4: Keanggunan dan Ketepatan

API BCMath berorientasikan objek PHP 8.4 memudahkan pengiraan tepat:

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
Salin selepas log masuk

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:

use BCMath\Number;

class Item extends Model
{
    // ... (accessor methods for quantity, price, discount, tax using Number) ...
}
Salin selepas log masuk

Atau dengan pelakon tersuai:

// ... (DecimalCast class implementation) ...
Salin selepas log masuk

Kemudian:

$item1 = Item::find(1);

$subtotal = $item1->price * $item1->quantity;
// ... (rest of the calculation) ...
Salin selepas log masuk

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 Laman Web ini
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 terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan