本文目錄一覽:
- 1、為什麼php用小數點相減不對呢
- 2、PHP計算百分比的公式函數,如何把數值裝進計算
- 3、PHP BC數學函數
- 4、請教,php保留兩位小數,但不四捨五入
- 5、php中3個小數的計算,如134.7-52.5 – 82.2,為什麼結果不是0而是一個奇怪的科學計數法?
- 6、PHP-bc函數及其應用詳解
為什麼php用小數點相減不對呢
一則浮點數計算例子如下:
代碼如下:
$a = 0.2+0.7;
$b = 0.9;
var_dump($a == $b);
列印出的結果是:bool(false)。也就是說在這裡 0.2+0.7 的計算結果與 0.9 並不相等,這顯然是有違我們的常識的。
對此問題,PHP官方手冊曾又說明:顯然簡單的十進位分數如 0.2 不能在不丟失一點點精度的情況下轉換為內部二進位的格式。這和一個事實有關,那就是不可能精確的用有限位數表達某些十進位分數。例如,十進位的 1/3 變成了 0.3333333…。
我們將上面的變數用雙精度格式列印出來:
代碼如下:
$a = 0.2+0.7;
$b = 0.9;
printf(“%0.20f”, $a);
echo ‘br /’;
printf(“%0.20f”, $b);
輸出結果如下:
代碼如下:
0.89999999999999991118
0.90000000000000002220
顯然在這裡,實際上作為浮點型數據,其精度已經損失了一部分,達不到完全精確。所以永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。需要說明的是,這不是PHP的問題,而是計算機內部處理浮點數的問題!在 C、JAVA 等語言中也會遇到同樣的問題。
所以要比較兩個浮點數,需要將其控制在我們需要的精度範圍內再行比較,因此使用 bcadd() 函數來對浮點數想加並進行精度轉換(為字元串):
代碼如下:
var_dump(bcadd(0.2,0.7,1) == 0.9); // 輸出:bool(true)
浮點數取整
在《PHP 取整函數 ceil 與 floor》一文中,曾有例子:
代碼如下:
?php
echo ceil(2.1/0.7); // 輸出:4
?
經過上面對浮點數計算的探討,知道這是浮點數計算結果不完全精確造成的:
代碼如下:
?php
printf(“%0.20f”, (2.1/0.7)); // 輸出:3.00000000000000044409
?
經過上面對浮點數計算的探討,知道這是浮點數計算結果不完全精確造成的,因此使用 round() 函數處理一下即可:
代碼如下:
?php
echo ceil( round((2.1/0.7),1) );
?
雖然 round() 函數是按照指定的精度進行四捨五入,但保留小數點後一位,對我們的取整結果是沒影響的。
PHP計算百分比的公式函數,如何把數值裝進計算
1、按題意字面理解,不用函數,直接在單元格輸入公式「=25/336」,回車,即可返回所需比例值。 2、如果336人是一列(如A1:A336)姓名明細,25人是在另列(如B1:B336)用「派出」、「留用」、「等待」等字樣標出,則可在任意單元格輸入公式「=COUNTIF(B1:B336,”派出”)/COUNTA(A1:A336)」進行計算。 建議,將你的示例上傳,以便有的放矢。
PHP BC數學函數
對於任意精度的數學,PHP提供了支持用字元串表示的任意大小和精度的數字的二進位計算,最多為2147483647-1(或0x7FFFFFFF-1)
所有格式都是bcxxx( right_operand, $scale = null)
請教,php保留兩位小數,但不四捨五入
使用bc一類的函數,按字元串方式運算即可。
/**
* 數值非四捨五入保留兩位小數
* @author Zjmainstay
* @website
* @param $num 數值
* @return 保留兩位小數
*/
function getNum($num, $scale = 2) {
$numStr = (string)$num . str_repeat(‘0’, $scale);
//匹配精度前的數值
if(preg_match(‘#^\d+\.\d{0,’.$scale.’}#’, $numStr, $match)) {
return $match[0];
} else {
return ‘0’;
}
}
echo getNum(10.0253) . “\n”;
echo getNum(0.5) . “\n”;
php中3個小數的計算,如134.7-52.5 – 82.2,為什麼結果不是0而是一個奇怪的科學計數法?
樓上的回答很詳細了,而且,這不僅僅是php的問題,你在js里console.log(134.7-52.5 – 82.2)
也得不到0的,
如果真要用php進行float計算的話,推薦BCMATCH,如:
echo bcsub(bcsub(134.7,52.5,1),82.2,1);
PHP-bc函數及其應用詳解
bcadd —— 兩個任意精度數字的加法計算 (PHP 4, PHP 5, PHP 7, PHP 8)
bcadd ( string $num1 , string $num2 , ?int $scale = null ): string
註:對 num1 和 num2 求和。
參數:
num1 — 左操作數,字元串類型。
num2 — 右操作數,字元串類型。
scale — 此可選參數用於設置結果中小數點後的小數位數。也可通過使用 bcscale() 來設置全局默認的小數位數,用於所有函數。如果未設置,則默認為 0。 現在 scale 可以為 null。
返回值: 以字元串返回兩個操作數求和之後的結果。
範例:
bcsub —— 兩個任意精度數字的減法 (PHP 4, PHP 5, PHP 7, PHP 8)
bcsub ( string $num1 , string $num2 , ?int $scale = null ): string
註: num1 減去 num2 。
參數:
num1 — 左操作數,字元串類型。
num2 — 右操作數,字元串類型。
scale — 此可選參數用於設置結果中小數點後的小數位數。也可通過使用 bcscale() 來設置全局默認的小數位數,用於所有函數。如果未設置,則默認為 0。 現在 scale 可以為 null。
返回值: 以 string 類型返回減法之後的結果。
範例:
bcmul —— 兩個任意精度數字乘法計算 (PHP 4, PHP 5, PHP 7, PHP 8)
bcmul ( string $num1 , string $num2 , ?int $scale = null ): string
註: num1 乘以 num2 。
參數:
num1 — 左操作數,字元串類型。
num2 — 右操作數,字元串類型。
scale — 此可選參數用於設置結果中小數點後的小數位數。也可通過使用 bcscale() 來設置全局默認的小數位數,用於所有函數。如果未設置,則默認為 0。 現在 scale 可以為 null。
返回值: 以 string 類型返回減法之後的結果。
範例:
bcp —— 兩個任意精度的數字除法計算 (PHP 4, PHP 5, PHP 7, PHP 8)
bcp ( string $num1 , string $num2 , ?int $scale = null ): string
註: num1 除以 num2 。
參數:
num1 — 左操作數,字元串類型。
num2 — 右操作數,字元串類型。
scale — 此可選參數用於設置結果中小數點後的小數位數。也可通過使用 bcscale() 來設置全局默認的小數位數,用於所有函數。如果未設置,則默認為 0。 現在 scale 可以為 null。
返回值: 以 string 類型返回減法之後的結果。
範例:
bccomp —— 比較兩個任意精度的數字 (PHP 4, PHP 5, PHP 7, PHP 8)
bccomp ( string $num1 , string $num2 , ?int $scale = null ): int
註: 比較 num1 和 num2 , 並且返回整型數字的結果。
參數:
num1 — 左邊的運算數,是一個字元串。
num2 — 右邊的運算數,是一個字元串。
scale — 可選的 scale 參數被用作設置指示數字, 在使用來作比較的小數點部分。
返回值: 兩個數相等時返回 0; num1 比 num2 小時返回 -1; 其他則返回 1。現在 scale 可以為 null。
範例:
bcmod —— 任意精度數字取模 (PHP 4, PHP 5, PHP 7, PHP 8)
bcmod ( string $num1 , string $num2 , ?int $scale = null ): string
註: 對 num1 使用 num2 取模。 除非 num2 是零,否則結果必定和 num1 有相同的符號。
參數:
num1 — string 類型的被除數。
num2 — string 類型的除數。
scale — 現在 scale 可以為 null。
返回值: 返回字元串類型取模後的結果,如果 num2 為 0 則返回 null。
範例:
bcpow—— 任意精度數字的乘方 (PHP 4, PHP 5, PHP 7, PHP 8)
bcpow ( string $num , string $exponent , ?int $scale = null ): string
註: num 的 exponent 次方運算。
參數:
num — string 類型的底數。
exponent — string 類型的指數。 如果指數不是整數,將被截斷。 指數的有效範圍取決於平台,但起碼支持 -2147483648 到 2147483647 的範圍。
scale — 此可選參數用於設置結果中小數點後的小數位數。也可通過使用 bcscale() 來設置全局默認的小數位數,用於所有函數。如果未設置,則默認為 0。
返回值: 返回字元串類型的結果。
範例:
bcpowmod —— 先取次方然後 取模 。 (PHP 5, PHP 7, PHP 8)
bcpowmod ( string $num , string $exponent , string $modulus , ?int $scale = null ): string
註: 先取次方然後取模。
參數:
base — 左操作數。它是一個字元串類型的參數。
exponent — string 類型的指數。 指數的正確操作數。
modulus — string 類型的 參 數。 接受表示模數的操作數。
scale — 一個整數類型參數。它說明 ( base exponent %mod ) 結果中小數點後的位數。其默認值為 0。
返回值: 該函數將結果作為字元串返回。或者,如果模數為 0 或指數為負,則返回 False。
範例:
bcscale —— 設置/獲取所有 bc math 函數的默認小數點保留位數 (PHP 4, PHP 5, PHP 7, PHP 8)
bcscale ( int $scale ): int
設置所有 bc math 函數在未設定情況下的小數點保留位數。
bcscale ( null $scale = null ): int
註: 獲取當前的小數點保留位數。
參數:
scale — 小數點保留位數。
返回值: 設置的時候,返回之前的小數點保留位數。否則就是返回當前的位數。
範例:
bcsqrt —— 任意精度數字的二次方根 (PHP 4, PHP 5, PHP 7, PHP 8)
bcsqrt ( string $num , ?int $scale = null ): string
註: 返回 num 的二次方根。
參數:
num — string 類型的操作數 。
scale — 此可選參數用於設置結果中小數點後的小數位數。也可通過使用 bcscale() 來設置全局默認的小數位數,用於所有函數。如果未設置,則默認為 0。
返回值: 以 string 類型返回二次方根的結果,如果 num 是負數則返回 null。
範例:
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/278332.html