PHP字串轉化為浮點數的坑

2021-08-21 06:48:13 字數 1018 閱讀 6890

偶然發現,將資料庫內decimal(20,2)型別的資料查出來,乘以100並轉化成整數的不精確問題。

**如下:

$a="19.49";

echo "a=\"$a\"\n";

var_dump($a

*100);

var_dump(intval($a

*100));

var_dump(intval(round($a

*100)));

$a="29.49";

echo "\na=\"$a\"\n";

var_dump($a

*100);

var_dump(intval($a

*100));

var_dump(intval(round($a

*100)));

輸出結果

a="19.49"

float(1949)

int(1948)//此處得到了1948的錯誤結果

int(1949)

a="29.49"

float(2949)

int(2949)//此處結果正確

int(2949)

由於資料庫查詢出來為字串型別,此處有將字串轉化為浮點型資料的過程,浮點數是不精確的:

float(19.49)可能在記憶體中的實際數值為19.489999,乘以100後為1948.9999..

float(29.49)可能在記憶體中的實際數值為29.490001,乘以100後為2949.0001..

單純的intval型別轉化會把記憶體中小數點後的全部捨掉,導致結果不精確。

此處案例暫用intval(round())解決,先把記憶體中小數點後的數值四捨五入,再轉化成整數。

浮點數轉化為字串

1 在不呼叫庫函式的情況下,把浮點數轉化為字串的難點就在,把小數轉化為字串。因為浮點數的精度問題,當我們對浮點數進行乘10操作的時候,浮點數尾數數值可能就會發生變化,如float a 12.1047 a 10 輸出a 121.046997。所以在把浮點數的小數轉化為字串時要對精度進行限制。1 inc...

16進製制字串轉化為浮點數

參考資料 1.2.3.問題 有時候在傳輸過程中會把浮點數使用如下形式儲存為二進位制形式 memcpy ibuf 4,f c0,sizeof float memcpy ibuf 4 4,f c1,sizeof float 在另一端怎麼將十六進製制形式的資料轉為浮點數呢?以下是簡單實現 include ...

hive浮點數轉化為整數

1 round 四捨五入 round double d 返回double型的d的bigint型別的近似值 round double d,int 返回double型的d的保留n位小數的double型別的近似值 如 select round cust rate from tmp.test select ...