偶然發現,將資料庫內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 ...