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