<?php
class Number{
public $number;
public $result;
public $limit = 0;
/**
* 二进制转十进制
* @param $number
* @return mixed
*/
public function twoChangeTen($number){
if (strpos($number , '.')){
$arr_number = explode('.' , $number);
$this->result = $this->twoChangeTenShang($arr_number[0]).'.'.$this->twoChangeTenShangYv($arr_number[1]);
}else{
$this->result = $this->twoChangeTenShang($number);
}
return $this->result;
}
/**
* 计算商
* @param $number
* @return float|int|string
*/
public function twoChangeTenShang($number){
$result = '';
$j = 0;
for ($i = strlen($number); $i > 0; $i--){
$result += substr($number , $i-1 , 1) * pow(2 , $j);
$j++;
}
return $result;
}
/**
* 计算余
* @param $number
* @return bool|string
*/
public function twoChangeTenShangYv($number){
$result = '';
for ($i = 0; $i < strlen($number); $i++){
$result += substr($number , $i , 1) * pow(2 , - ($i+1));
}
return substr($result , 2);
}
/**
* 十进制转二进制
* @param $number
* @return mixed
*/
public function tenChangeTwo($number){
$this->number = $number;
if (strpos($number , '.')){
$exp = explode('.',$number);
$this->tenChangeTwoYv('0.'.$exp[1]);
$yv = substr($this->result , 1);
$this->result = '';
$this->tenChangeTwoJi($exp[0]);
$data = $this->result.'.'.$yv;
}else{
$this->tenChangeTwoJi($this->number);
$data = $this->result;
}
return $data;
}
/**
* 计算积
* @param $number
* @return float
*/
public function tenChangeTwoJi($number){
if ($number == 0)return $this->result = 0;
$this->number = floor($this->number / 2);
$this->result = $number % 2 . $this->result;
if ($this->number >= 1){
$this->tenChangeTwoJi($this->number);
}
}
/**
* 计算余
* @param $number
* @return bool
*/
public function tenChangeTwoYv($number){
if (!strpos($number,'.') || $this->limit > 55){
$this->result .= 1;
return false;
}
$exp = explode('.',$number);
$this->result .= $exp[0];
$data = '0.'.$exp[1];
$number = $data * 2;
$this->limit++;
$this->tenChangeTwoYv($number);
}
}
$number_obj = new Number();
echo $number_obj->tenChangeTwo(0.7);
//echo $number_obj->twoChangeTen('10111000000010');