原發表於Takeshi Yu的部落格。
準確的數值計算在企業應用程式中至關重要,尤其是那些涉及財務、會計或庫存的應用程式。 即使很小的捨入誤差也會導致嚴重的問題。 PHP 8.4 增強的 BCMath 物件 API 為精確且有效率的小數計算提供了完善的解決方案。
經驗豐富的 PHP 開發人員熟悉浮點不精確性:
$a = 0.1; $b = 0.2; var_dump($a + $b); // Outputs: 0.30000000000000004
這種不準確在金融環境中是不可接受的。 這些小錯誤累積起來,就會導致現實世界的差異。
精確的資料庫設計
精確的小數計算從資料庫開始。 DECIMAL
類型是必需的:
// 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 });
DECIMAL
確保:
- 精確的小數精度。
- 可自訂的比例和精度。
- 適用於金融應用。
雖然可能比 FLOAT
稍慢,但精度優勢超過了關鍵任務系統中的效能差異。
利用 Laravel 的 Cast
Laravel 透過其轉換系統簡化了小數處理:
class Item extends Model { protected $casts = [ 'quantity' => 'decimal:3', 'price' => 'decimal:3', 'discount' => 'decimal:3', 'tax' => 'decimal:3', ]; }
但是,請記住 Laravel 鑄造主要管理:
- 資料格式化。
- 一致的值表示。
避免型別轉換陷阱
即使使用正確的資料庫類型和 Laravel 轉換,也可能會出現計算錯誤:
// 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
發生這種情況是因為 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)
PHP 8.4 之前的 BCMath:精確但乏味
傳統的 BCMath 擴展提供了精度:
// 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"
然而,複雜的計算變得冗長且難以維護:
// Complex order calculation (using BCMath functions) // ... (code omitted for brevity)
PHP 8.4 的 BCMath 物件 API:優雅與精確
PHP 8.4 物件導向的 BCMath API 簡化了精確計算:
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
新 API 的優點:
- 直覺的物件導向設計。
- 標準數學運算符支援。
- 用於資料完整性的不可變物件。
-
Stringable
介面實作。
無縫 Laravel 整合
Laravel 的訪客實現了進一步的優雅:
use BCMath\Number; class Item extends Model { // ... (accessor methods for quantity, price, discount, tax using Number) ... }
或使用自訂演員表:
// ... (DecimalCast class implementation) ...
然後:
$item1 = Item::find(1); $subtotal = $item1->price * $item1->quantity; // ... (rest of the calculation) ...
結論
在醫療保健庫存管理中,精確的小數計算至關重要。 PHP 8.4 的 BCMath 物件 API 與 Laravel 集成,顯著改進了這些計算的處理,提供精度、可讀性、可維護性和類型安全性。 雖然舊的 BCMath 函數達到了其目的,但這種新方法大大簡化了開發。
以上是使用新的 BCMath 物件 API 在 PHP 中處理小數計算的詳細內容。更多資訊請關注PHP中文網其他相關文章!

負載均衡會影響會話管理,但可以通過會話複製、會話粘性和集中式會話存儲解決。 1.會話複製在服務器間複製會話數據。 2.會話粘性將用戶請求定向到同一服務器。 3.集中式會話存儲使用獨立服務器如Redis存儲會話數據,確保數據共享。

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

PHP會話的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。 1.Cookies通過在客戶端存儲數據來管理會話,簡單但安全性低。 2.Token-basedAuthentication使用令牌驗證用戶,安全性高但需額外邏輯。 3.Database-basedSessions將數據存儲在數據庫中,擴展性好但可能影響性能。 4.Redis/Memcached使用分佈式緩存提高性能和擴展性,但需額外配

Sessionhijacking是指攻擊者通過獲取用戶的sessionID來冒充用戶。防範方法包括:1)使用HTTPS加密通信;2)驗證sessionID的來源;3)使用安全的sessionID生成算法;4)定期更新sessionID。

本文比較了PHP和ASP.NET,重點是它們對大規模Web應用程序,性能差異和安全功能的適用性。兩者對於大型項目都是可行的,但是PHP是開源和無關的,而ASP.NET,


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。