【Java】小数の10進数を2進数に変換 | りょうとのITブログ

りょうとのITブログ

Windows 10 Pro 64bit 始めました。

タイトルの通りです。

整数の10進数 -> 2進数変換プログラムはググれば直ぐ出来るんですけど、小数はそういうメソッドが無かったりします。

要は、Float.toBinaryString()メソッドなんてものは実装されてない。

 

無いなら自分で作ろう!という事で作りました:

 

import java.util.Scanner;
import java.lang.String;
class ToBinFraction{
    public static void main(String args[]){
    Scanner sc = new Scanner(System.in);
    System.out.println("Input a fraction number: ");
    String inputNum = sc.next();
    float f = Float.valueOf(inputNum);
    String bin = "0.";
    while(f != 0){
        f = f * 2;
        if(f >= 1.0){
        bin = bin.concat("1");
        } else {
        bin = bin.concat("0");
        }
        f = f % 1;
    }
    System.out.println("Output binary: ");
    System.out.println(bin);
    }
}

さて結果の検証!

まずはお決まりの優しい数を入力してみます:

 

$ java ToBinFraction
Input a fraction number:
0.875
Output binary: 0.111

 

正しく出力されました。

次は優しくない数を入力:

 

$ java ToBinFraction Input a fraction number: 0.1 Output binary: 0.000110011001100110011001101

 

合ってるのかな…。

という事で、次は小数の2進数を10進数へ変換するプログラムで検証です。

プログラム:

 

import java.util.Scanner;

class ToDec{
  public static void main(String args[]){
     Scanner sc = new Scanner(System.in);

     System.out.println("Input a fraction number: ");
     String inputNum = sc.next();
     double f = 0.0;
     double fracNum = 0.5;

    while(!inputNum.isEmpty()){
      if(inputNum.charAt(0) == '1'){
         f = f + fracNum;
      }
      inputNum = inputNum.substring(1);
      fracNum = fracNum / 2.0;
    }
    System.out.println("Output decimal: ");
    System.out.println(f);
  }
}

 

結果:

 

$ java ToDec
Input a fraction number:
000110011001100110011001101
Output decimal:
0.10000000149011612

 

おっと誤差が…(やっぱり…)。

丸めというかちょっとググった所、BigDecimalクラスを使った方が良い、とのことです。

という訳で次回はその版を試みます。

 

以上!