なぜ多数によって弾性率はJavaで間違った答えを与えるように見えるん

Snedden27:

私は数がゼロの末尾の数字を見つけようとしています、ここに私のコードは次のとおりです。

public class TrailingZeroes {
    public static void  bruteForce(int num){ //25
        double fact = num; //25
        int numOfZeroes = 0;

        for(int i= num - 1; i > 1; i--){
            fact = fact * (i);
        }
        System.out.printf("Fact: %.0f\n",fact); //15511210043330984000000000

        while(fact % 10 == 0){
          fact = fact / 10;
          double factRem = fact % 10;
          System.out.printf("Fact/10: %.0f\n",fact); //1551121004333098400000000
            System.out.printf("FactRem: %.0f\n",factRem); // 2?
          numOfZeroes++;
        }

        System.out.println("Nnumber of zeroes "+ numOfZeroes); //1

    }
}

あなたは事実%10を見ることができるように

oleg.cherednik:

あなたは、使用ポイント浮動違法にデータ型を。

floatそしてdoubleJavaでプリミティブ型である点フローティング数は分数と指数のバイナリ表現として記憶される数値を、。

より具体的には、倍精度などの浮動小数点値doubleのタイプは、64ビット値は、次のとおりです。

  • 1ビットは符号(正または負)です。
  • 指数のための11ビット。
  • 有効数字のための52ビット(バイナリとして小数部分)。

これらの部品は製造するために結合されるdouble値の表現。

浮動小数点値はJavaで処理する方法の詳細については、を参照浮動小数点型、フォーマット、および値:4.2.3 Java言語仕様のを。

bytecharintlongタイプは数字の正確representionsある[固定小数点] [6]の数字です。固定小数点数とは異なり、浮動小数点数は、いくつかの回(「ほとんどの時間を」前提とする安全では)数の正確な表現を返すことはできません。これは、あなたがで終わる理由でもある11.399999999999の結果として5.6 + 5.8

こうした1.5または150.1005として、正確な値を必要とするとき、あなたは正確に数を表すことができるようになりますこれは、固定小数点タイプのいずれかを使用したいと思います。

すでに何度か述べてきたように、JavaがありBigDecimal、非常に大きな数字と非常に小さい数字を処理するクラスを。


public static void bruteForce(int num) {    //25
    double fact = num;

    // precision was lost on high i
    for (int i = num - 1; i > 1; i--)
        fact *= i;

    String str = String.format("%.0f", fact);   //15511210043330984000000000
    System.out.println(str);

    int i = str.length() - 1;
    int numOfZeroes = 0;

    while (str.charAt(i--) == '0')
        numOfZeroes++;

    System.out.println("Number of zeroes " + numOfZeroes);  //9
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=199976&siteId=1