java 中 二進制串與浮點數的相互轉化


/*
* 二進制串"10010111.10010010" 轉化為double型
* double型 轉化為 二進制串

* 例如:"1111.11"===>15.75
* 15.75===>"1111.11"
*/

首先 把二進制串轉為double型

先把輸入的字符串以小數點"."為界,分為整數部分和小數部分(注意:如果沒有小數部分,在串的末尾補上".0")。

先做整數部分:

整數部分的公式如下:

例如:1101--->((1*2+1)*2+0)*2+1==13

利用遞歸方法,從后往前遞歸,除最后一位外,其他的被轉化為整數時,只需要加上把最后一位的真值。

當輸入的串只剩一位時,返回該串的真值,結束遞歸。

同理,小數部分轉化如下:

例如:0.001與整數分離后為001,

001--->0/2 + 0/(2*2) + 1/(2*2*2)==0.125

利用遞歸方法,從前往后遞歸,除第一位外,其他的被轉成浮點數,只需要加上第一位所轉化的浮點數。

當輸入的串只剩下一位時,返回他的浮點數,結束遞歸。

程序如下

//2017.03.15 by 迷糊狐狸

import java.util.Scanner;
public class Test { static Scanner scan = new Scanner(System.in); //把整數部分轉成double static int sToInt(String s){ if(s.length()==1) return s.charAt(0)-'0'; return sToInt(s.substring(0,s.length()-1)) * 2 + (s.charAt(s.length()-1)-'0'); } //把小數部分轉成double static double sToDou(String s){ if(s.length()==1) return (s.charAt(0)-'0')/2.0; return (s.charAt(0)-'0')/2.0 + sToDou(s.substring(1))/2.0; } //把輸入的字符串分成整數部分s1和小數部分s2 static double strToDou(String s){ int n = s.indexOf("."); if(n<0){ s += ".0"; n = s.indexOf("."); } String s1 = s.substring(0,n); String s2 = s.substring(n+1); return sToInt(s1) + sToDou(s2); } public static void main(String[] args) { System.out.println("請輸入一個二進制串:"); String s = scan.nextLine().trim(); System.out.println(strToDou(s)); } }

 

程序運行結果如下圖所示:

示例1

 

示例2

 

示例3

 

接下來把浮點數轉成二進制串,過程與上述相似,只是公式不同。

也是把輸入的浮點數(下述程序直接輸入的串,如果輸入的是浮點數請注意返回值)分為整數部分與小數部分(同樣注意如果沒有小數部分,分開前在輸入串的末尾補上".0")分別轉化后再加入一個串中(注意:相加時整數部分為零的話,在小數點前補"0")。

整數部分的公式為:

例如:15--->"" + 15/2/2/2%2 + 15/2/2%2 + 15/2%2 + 15%2 == 1111。

小數部分公式如下:

例如:0.0625--->  0.0625*2 == 0.125, (int)0.125 == 0;

                  0.125-0 == 0.125, 0.125*2 == 0.25, (int)0.25 == 0;

                  0.25-0 == 0.25, 0.25*2 == 0.5, (int)0.5 == 0;

                  0.5-0 == 0.5, 0.5*2 == 1.0, (int)1.0 == 1;

                  1.0-1 == 0.0結束

      0.0625--->  0001。

把整數部分與小數部分合成一個串(注意:中間用"."隔開)。

程序如下:

//2017.03.15 by 迷糊狐狸

import java.util.Scanner; public class Test { static Scanner scan = new Scanner(System.in); //把輸入的浮點數分成整數部分和小數部分
    static String douToStr(String s){ int n = s.indexOf("."); if(n<0){ s += ".0"; n = s.indexOf("."); } String s1 = s.substring(0,n); String s2 = "0" + s.substring(n); String s3 = intToStr(Integer.parseInt(s1)); String s4 = dToStr(Double.parseDouble(s2)); return  (s3.length()==0? 0 : s3) + "." + s4; } //把整數部分轉成二進制
    static String intToStr(int n){ if(n==0) return ""; int a = n % 2; int b = n / 2; return intToStr(b) + a; } //把小數部分轉成二進制
    static String dToStr(double d){ if(d-(int)d<0.01) return "" + (int)d; int n = (int)(d * 2); double a = d * 2 - n; return "" + n + dToStr(a); } public static void main(String[] args) { System.out.println("請輸入一個二進制串:"); String s = scan.nextLine().trim(); System.out.println(strToDou(s)); System.out.println("請輸入一個浮點數:"); String s2 = scan.nextLine().trim(); System.out.println(douToStr(s2)); } }

 

程序運行結果如下:

 

示例1

 

示例2

 

示例3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM