php下的浮點運算準不準
不準,php下的浮點運算有誤差。在PHP中,浮點數的精度有限;儘管取決於系統,PHP通常使用IEEE 754雙精度格式,則由於取整而導致的最大相對誤差為「1.11e-16」;而非基本數學運算可能會給出更大誤差,並且要考慮到進行複合運算時的誤差傳遞。
本教學操作環境:windows7系統、PHP8版、DELL G3電腦
浮點數運算的「鍋」
//加 $a = 0.1; $b = 0.7; $c = intval(($a + $b) * 10); echo $c."<br>"; //输出:7 //减 $a = 100; $b = 99.98; $c = $a - $b; echo $c."<br>"; //输出:0.019999999999996 //乘 $a = 0.58; $b = 100; $c = intval($a * $b); echo $c."<br>"; //输出:57 //除 $a = 0.7; $b = 0.1; $c = intval($a / $b); echo $c."<br>"; //输出:6
上面的結果,顯然不是我們想要的!
PHP 官方手冊解釋如下:
#浮點數的精確度有限。儘管取決於系統,PHP 通常使用 IEEE 754 雙精度格式,則由於取整而導致的最大相對誤差為 1.11e-16。非基本數學運算可能會給出更大誤差,並且要考慮到進行複合運算時的誤差傳遞。永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。如果確實需要更高的精度,應該使用任意精度數學函數 或 gmp 函數。
這裡的關鍵在於,浮點數的小數用二進位的表示,過程如下:
- 將小數乘以2,取整數部分錶示第一位;
- 將小數部分乘以2,取整數部分錶示第二位;
- 再將小數部分乘以2,取整數部分錶示第三位;
- .. . 依序類別推,直到小數部分為0;
例:0.58
- 0.58 * 2 = 1.16 ---> 1
- 0.16 * 2 = 0.32 ---> 0
- 0.32 * 2 = 0.64 ---> 0
- 0.64 * 2 = 1.28 ---> 1
- 0.28 * 2 = 0.56 ---> 0
- 0.56 * 2 = 1.12 ---> 1
- #0.12 * 2 = 0.24 ---> 0
- # 0.24 * 2 = 0.48 ---> 0
- 0.48 * 2 = 0.96 ---> 0
- 0.96 * 2 = 1.92 ---> 1 ##0.96 * 2 = 1.92 ---> 1
- ...
接下來要跟大家介紹 任意精確度數學函數
。任意精確度數學函數
對於任意精確度的數學,PHP 提供了支援以字串表示的任意大小和精確度的數字的二進位計算。 BCMath:BC 是 Binary Calculator 的縮寫。官方手冊:http://php.net/manual/zh/book.bc.php
大家在使用前,請先確認是否已安裝bcmath 。//加 $a = 0.1; $b = 0.7; $c = intval(bcadd($a, $b, 1) * 10); echo $c."<br>"; //输出:8 //减 $a = 100; $b = 99.98; $c = bcsub($a, $b, 2); echo $c."<br>"; //输出:0.02 //乘 $a = 0.58; $b = 100; $c = intval(bcmul($a, $b)); echo $c."<br>"; //输出:58 //除 $a = 0.7; $b = 0.1; $c = intval(bcdiv($a, $b)); echo $c."<br>"; //输出:7
- bccomp 比較兩個任意精確度的數字
- bcmod 對任意精確度數字取模
- bcpow 任意精確度數字的乘方
- bcpowmod 高精準度數字乘方求模
- bcscale 設定所有bc數學函數的預設小數點保留位數
- bcsqrt任意精度數字的二次方根
常用數值處理方案
捨去法取整(向下取整)
echo floor(5.1);
//输出:5
echo floor(8.8);
//输出:8
登入後複製
進一法取整(向上取整)
echo floor(5.1); //输出:5 echo floor(8.8); //输出:8
echo ceil(5.1);
//输出:6
echo ceil(8.8);
//输出:9
登入後複製
普通四捨五入法
echo ceil(5.1); //输出:6 echo ceil(8.8); //输出:9
echo round(5.1);
//输出:5
echo round(8.8);
//输出:9
//保留两位小数并且进行四舍五入
echo round(5.123, 2);
//输出:5.12
echo round(8.888, 2);
//输出:8.89
//保留两位小数并且不进行四舍五入
echo substr(round(5.12345, 3), 0, -1);
//输出:5.12
echo substr(round(8.88888, 3), 0, -1);
//输出:8.88
登入後複製
#銀行家舍入法
四捨六入五考慮,五後非空就進一,五後為空看奇偶,五前為偶應捨去,五前為奇要進一。 保留兩位小數,例:echo round(5.1); //输出:5 echo round(8.8); //输出:9 //保留两位小数并且进行四舍五入 echo round(5.123, 2); //输出:5.12 echo round(8.888, 2); //输出:8.89 //保留两位小数并且不进行四舍五入 echo substr(round(5.12345, 3), 0, -1); //输出:5.12 echo substr(round(8.88888, 3), 0, -1); //输出:8.88
- 1.2849 = 1.28 -> 四捨
- 1.2866 = 1.29 -> 六入
- #1.2866 = 1.29 -> 六入
- 1.2851 = 1.29 -> 五後非空就進一
- #1.2850 = 1.28 -> 五後為空看奇偶,五前為偶應捨去
#1.2750 = 1.28 -> ; 五後為空看奇偶,五前為奇要進一
echo round(1.2849, 2, PHP_ROUND_HALF_EVEN); //输出:1.28 echo round(1.2866, 2, PHP_ROUND_HALF_EVEN); //输出:1.29 echo round(1.2851, 2, PHP_ROUND_HALF_EVEN); //输出:1.29 echo round(1.2850, 2, PHP_ROUND_HALF_EVEN); //输出:1.28 echo round(1.2750, 2, PHP_ROUND_HALF_EVEN); //输出:1.28
http ://php.net/manual/zh/function.round.php
#數值格式化(千位元分組)
套用於金額的展示,例如我們經常會看的銀行卡餘額。 echo number_format('10000.98', 2, '.', ',');
//输出:10,000.98
echo number_format('340888999', 2, '.', ',');
//输出:340,888,999.00
登入後複製
echo number_format('10000.98', 2, '.', ','); //输出:10,000.98 echo number_format('340888999', 2, '.', ','); //输出:340,888,999.00
擴充功能
MySQL 浮點類型欄位
在 MySQL 中,在建立表格欄位時也有浮點數類型。浮點數類型包括單精度浮點數(float)和雙精度浮點數(double)。
同理,不建議使用浮點數型別! ! !
######浮點數存在誤差,當我們使用精確度敏感的資料時,應該使用定點數(decimal)進行儲存。 ###小結
透過浮點數精確度的問題,了解到浮點數的小數用二進位的表示。
分享了用 PHP 任意精確度數學函數,來進行高精度運算。
同時分享了常用數值處理方案,例如捨去法、進一法、四捨五入法、銀行家舍入法、數值格式化 等。
最後,透過 PHP 的 float 聯想到 MySQL 的 float。
以後,在使用浮點數運算的時候,一定要慎之又慎,細節決定成敗。
推薦學習:《PHP影片教學》
以上是php下的浮點運算準不準的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
