java浮点数转二进制_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 classTest {static Scanner scan = newScanner(System.in);//把整数部分转成double

static intsToInt(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 doublesToDou(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 doublestrToDou(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 voidmain(String[] args) {

System.out.println("请输入一个二进制串:");

String s=scan.nextLine().trim();

System.out.println(strToDou(s));

}

}

程序运行结果如下图所示:

示例1

edfbad36456e8c5f41fe4906d7d4124b.png

示例2

eb5d53637d9b2b79a0c7078f3a32ef16.png

示例3

525b232773d36e5b941add84ab32448c.png

接下来把浮点数转成二进制串,过程与上述相似,只是公式不同。

也是把输入的浮点数(下述程序直接输入的串,如果输入的是浮点数请注意返回值)分为整数部分与小数部分(同样注意如果没有小数部分,分开前在输入串的末尾补上".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 迷糊狐狸

importjava.util.Scanner;public classTest {static Scanner scan = newScanner(System.in);//把输入的浮点数分成整数部分和小数部分

staticString 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(intn){if(n==0) return "";int a = n % 2;int b = n / 2;return intToStr(b) +a;

}//把小数部分转成二进制

static String dToStr(doubled){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 voidmain(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

6f5ed27ec3646f2c1797ef016b629ba3.png

示例2

383624dd022587b99f1a5b569fe7bc29.png

示例3

7c6a9bf58de3a5df9207e27366bae973.png


版权声明:本文为weixin_42382703原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。