:Math.random()がダブルス「よりも大きいか等しい戻りますので、要約すると奇妙な二重の丸めの問題
public static String findOutWhatLifeIsAllAbout() {
int meaning = 0;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 20; j++) {
for (int k = 0; k < 300; k++) {
for (int m = 0; m < 7000; m++) {
meaning += Math.random() + 1;
}
}
}
}
return String.valueOf(meaning).replaceAll("0*$", "");
}
は、期待される結果は、文字列「42」であります0.0以上1.0未満」とする。実際には、Ubuntuの下でi5を実行すると、結果の文字列は "420000011"、 "420000008"に似ています! (意味時々Math.random()、何とかラウンド 1秒結果の結果がはMath.random()を引き起こすdouble値のどのような種類のグリップを取得するには!
を切り上げなっています "私はいくつかの例を見て期待し、代わりにこの機能を試してみました。
public static String findOutWhatLifeIsAllAboutAltered() {
int meaning = 0;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 20; j++) {
for (int k = 0; k < 300; k++) {
for (int m = 0; m < 7000; m++) {
double randomResult = Math.random();
int converted = randomResult;
if (converted > 0) {
System.out.println("Misbehaving double = " + randomResult);
}
meaning += converted + 1;
}
}
}
}
return String.valueOf(meaning).replaceAll("0*$", "");
}
しかし、この製剤は常に「42」を返します!誰もが変更された機能で、なぜ行動の変化についての洞察を提供することはできますか?ありがとう。
さらに理由Javaは元のfunctioを許可しますか? nコンパイルは全くですか? +=
コールで精度の損失が発生しないようにしてください。
編集あなたが見たいと思っていたコードを投稿しました。「元の」バージョンはキャストされていませんでした。
これをコンパイルするJavaのバージョンは何ですか?私はこれをテストし、Java 1.6を使って正解を返します。 – Yuushi
また、私のシステム(OS X上のJava 1.6)では、両方の関数が '' 42 "'を返します。 –
"修正された"最初の例。 intにキャストされるはずがありませんでした。そのコードは、予期しない結果をコンパイルして示します。 –