十进制小数与二进制小数相互转换
一、十進制小數轉二進制小數的方法
今天看到鳥哥的一篇博客,里邊說的額是浮點數的問題,結果里邊的小數轉換成二進制數我就鬧不明白,通過在網上查詢,知道咋回事了,先上一段代碼(隨便寫的):
/**
* 十進制小數轉二進制小數的方法
* @param $decimal 操作的小數(比如:0.75,0.57等)
* @param $bit 位數保留多少位二進制數
* @return [type] $binary (小數的二進制數)
*/
function getBinaryDecimal($decimal = 0,$bit = 32){
if(!is_numeric($decimal))exit('參數錯誤!');
$binary = ''; //返回的二進制數
$base = $decimal; //記錄計算的基數(以此為終止循環條件)
$i = 0; //控制二進制數的位數,因為可能無窮無盡,所以只能盡可能的接近
while($base != 0 && $i++ < $bit){
$tmp = 0; //記錄每一次計算的結果
$tmp = $base * 2;
if($tmp >= 1){
$base = $tmp - 1;
$binary .= 1;
}else{
$base = $tmp;
$binary .= 0;
}
}
//返回用戶需要的指定位數
return $binary;
}
上面的函數寫的有點簡陋,只是針對小數部分,差不多就那么個意思,接下來我就說下小數轉二進制數的計算方式,通過上面的函數也不難看出:
例一:0.6(用小數去乘2,得到的結果大于1的,二進制數在該位就是1,然后用結果減去1剩下的小數繼續執行上一步操作,直到結果為0)
計算表達式 結果 二進制數 剩余小數(結果)
0.6 * 2 1.2 1 0.2(1.2 - 1)
0.2 * 2 0.4 0 0.4
0.4 * 2 0.8 0 0.8
0.8 * 2 1.6 1 0.6(1.6 - 1)
.......... ..... ... .....
例二:0.75
計算表達式 結果 二進制數 剩余小數(結果)
0.75 * 2 1.5 1 0.5(1.5 - 1)
0.5 * 2 1 1 0(1 - 1)
結果0.75的二進制數為0.11
一直這樣計算下去,直到剩余的結果為0時,才算計算結束,然后把二進制數拼接起來就是該小數對應的二進制數了,例一會無限循環下去,例二則不會;
其實上面的例子只是我們自己的理想算法,真正在程序中就算的結果可能回是 "0.49999999999999"而不是0.5,這樣的話0.75的二進制數也將是無窮無盡的;
注意:可能一直計算下去會出現無窮無盡,所以我加了一個位數來控制,只能盡可能的接近值,而不能說一定準確的得到一個小數的二進制數
二、二進制小數轉十進制小數的方法
上面咱們已經討論了如何將十進制小數轉換成二進制小數,就是不斷的*2,然后跟1比較來取二進制位的值,然后根據把剩余的值繼續乘于2,一直循環,知道結果為0時為止,那么二進制小數如何轉換成十進制的小數呢?接下來咱們就來看看
例一:把二進制數0.11轉換成十進制小數
(0.11)2 = 0 * 20+ 1 * 2-1+ 1 * 2-2
= 0 + 0.5 + 0.25
= 0.75
以上就是計算的方式,小數點后的數字從-1開始,一直計算下去,下面是我隨便寫的兩句代碼:
/**
* 二進制小數轉十進制小數的方法
* @param $binary 需要計算的二進制數
*
* @return [type] $result
*/
function getDecimalResult($binary){
if(!$binary)exit('參數錯誤!');
//獲取數組數量
$binary = str_split($binary);
$binary_count = count($binary);
//結果
$result = 0;
$i = 0;
while($i < $binary_count){
//計算結果
$result += $binary[$i] * pow(2,-($i+1));
$i++;
}
return $result;
}
以上就是二進制小數和十進制小數相互轉換的方法,寫的不好希望大家多多指正,謝謝!
總結
以上是生活随笔為你收集整理的十进制小数与二进制小数相互转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 权值初始化
- 下一篇: 插入排序(直接插入、折半、Shell)