zoukankan      html  css  js  c++  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 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

  • 相关阅读:
    COM学习(三)——数据类型
    com学习(一)GUID 和 接口
    Dll学习(二)__declspec用法详解
    dll 学习(一)
    PostMessage与SendMessage的区别(二)
    sendmessage和postmessage的区别
    用Java开发代理服务器
    JAVA编写WEB服务器
    【1.3】Django HelloWorld
    【1.2】初识Django应用
  • 原文地址:https://www.cnblogs.com/liyuanba/p/Java---2---to---double.html
Copyright © 2011-2022 走看看