Float⇔Double変換問題

float-double.png
class Main {
    public static void main(String[] args){
        float f=0.71480834f;
        double d=f;
        //勝手に入れてもいない情報を入れてくれちゃってる
        System.out.println("d:"+d+"\n f:"+f);
 
    }
 
}

出力結果
d:0.7148083448410034
f:0.71480834

あれdoubleの方に、入れてもいない情報がはいってる!!
なんだ48410034って!
たぶん、データの格納方式的にそうなっちゃうんだ。
じゃあこの桁よりあっちはいらないんですけどとなったら、
一旦10^8倍してint型にしてからdoubleにするしかないかな なんか、馬鹿みたいだな。

どうしても!floatの数値をそのままそっくりdoubleにコピーしたい場合

Stringを使うと解決できる。パフォーマンス的にどうなのかなぁ、

float f=0.71480834f;
double dd=Double.valueOf(String.valueOf(f));

問題ない

double=int

は問題ない。

8桁以上は問題有り

float=int

そのint型が8桁以上だったら下桁の方で値が違うものに変わったりする。
intの最大値は2147483647なので、むやみやたらにfloat⇔int型変換するのは危険

色々実験してみました

formatで数値から文字を変換すると正しい結果にならないですね。

class Main {    
    public static void main(String[] args){        
            float f=0.71480834f;
            double d=f;
            //勝手に入れてもいない情報を入れてくれちゃってる
            System.out.println("d:"+d+"\nf:"+f);    
            String fstring=String.valueOf(f);
            String formatStr=String.format("%f", f);
            System.out.println("○:valueOf:"+fstring);
            System.out.println("x:format:"+formatStr);
            Double dd=Double.valueOf(fstring);
            System.out.println("double:"+dd+"\nfloat:"+f);    
        }     
    }

出力結果
d:0.7148083448410034
f:0.71480834
○:valueOf:0.71480834
x:format:0.714808
double:0.71480834
float:0.71480834

整数として扱うなら問題なし?

/**単精度基準点*/
private static final int MAX_FLOAT_DIGIT = 1000000;
int t = (int) (doubleな値/ MAX_FLOAT_DIGIT );
double org = t * MAX_FLOAT_DIGIT ;
// 下6桁
return (float) ((doubleな値- org));//ここ、doubleで返しても問題なし。

cast double-float float number

サポートサイト Wikidot.com castdouble-floatfloatnumber