3

丸めたり切り捨てたりせずに、ランダムな double を long に変換しようとしています。最初に double を文字列に変更し、小数点以下の桁数を確認してから、値を long に変更します。私の問題は、最後の小数点以下の桁数が常に正しいとは限らず、その理由と変更方法がわからないことです。コードは次のとおりです。

            double z=(double) myRandom(1, 20);
    long test;
    String s = Double.toString(z);
    test=(long) (Math.pow(10, s.length()-s.indexOf(".")-1)*z);
    System.out.println("z: "+z);    
    System.out.println("double converted to long: "+test);

そして、それが出力です:

d: 19.625014811604743

double を long に変換: 19625014811604744

日: 9.143326452202839

double を long に変換: 9143326452202838

日: 5.8964228376511105

double を long に変換: 58964228376511104

d: 15.045936360299917

double を long に変換: 15045936360299918

d: 14.147950026532694

double を long に変換: 14147950026532694

4

6 に答える 6

3

現在の実装の編集:

double z=(double) myRandom(1, 20);
String s = Double.toString(z); //convert to string (edited thanks to comments)
s = s.replaceAll(".", ""); //remove the period
long test = Long.parseLong(s); //convert to long

または、ランダムが必要な場合は、代わりにLong使用することをお勧めしRandom.nextLong()ます。

于 2013-08-07T18:22:30.107 に答える
2

長い乱数を取得することが目的の場合は、代わりに Random.nextLong() を使用することを強くお勧めします。

于 2013-08-07T18:19:54.690 に答える
0

あなたはこのようなことをすることができます...

double x = 19.625014811604743;
while(x % 1 != 0) x *= 10;
long y = (long) x;
System.out.println("x: "+ x + " y: "+ y);
于 2013-08-07T18:43:25.157 に答える
0
test=(long) (Math.pow(10, s.length()-s.indexOf(".")-1)*z);

算術で double を台無しにしています。次のようなことを試してください。

public long convertDoubleToLong(double d){
  String str = Double.toString(d);
  return Long.parseLong(str.replace(".", ""));
}
于 2013-08-07T18:23:39.477 に答える