タイトルの通りです。
整数の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クラスを使った方が良い、とのことです。
という訳で次回はその版を試みます。
以上!