2016-12-08 22 views
0

Javaプログラムでこの精度の低下がなぜ発生しているのか理解しようとしています。Javaプログラムエラー:精度の低下の可能性

これは誤りである:

error: possible loss of precision 
     int digit = num/Math.pow(10,i-1)%10; 
             ^
    required: int 
    found: double 
1 error 

これはループ

for(int i = 1; i<=String.valueOf(num).length(); i++) 
{ 
    int digit = num/Math.pow(10,i-1)%10; 
    //etc 
} 

ための内部コードクリップであるIは、整数変数として数字を維持したい、と私は外の数字を宣言しようとしましたループ、私はまた、動作しない整数にキャストしようとしました。私はそれをやってみました:魔法のように働いた

digit += num/Math.pow(10,i-1)%10; //with digit declare outside of loop 

が、私が代わりに私はそれが私が後で使用できる数字を含むようにしたい、それをインクリメントする必要はありません。私がここで紛失しているものはありますか?説明してください。

+0

使用 'INT桁= NUM​​ /(INT)Math.pow(10、I-1)10%;'。 [Math.pow](https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#pow(double、%20double))はdoubleを返します。私は 'num'がintであると仮定しています。 – byxor

+0

キャスティングはあなたのソリューションです。 '+ ='でのエラーの欠如については、この問題で説明されています(http://stackoverflow.com/q/8710619/5743988)。 – 4castle

+0

可能性のある重複の可能性[精度の可能性があります - modで(しかしそれではありません)](http://stackoverflow.com/questions/37548399/possible-loss-of-precision-with-mod-but-its-not) – mdewitt

答えて

2

は、私はあなたのコードを実行しようとした:

int digit = (int) (num/Math.pow(10,i-1)%10); 

そして予想通り、それは働いていた、すなわち、それは(私はint型とする)あなたの変数NUMの桁を反復しました。

+ =演算子を使用すると、マジックのためではなく、自動型昇格のために機能します。ここでそれについてもっと読むことができます:http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

+0

最初にキャストしようとしたときに、オブジェクト参照のカッコが忘れてしまった。しかし、今はうまくいく、ありがとう。 – UnstoppableMrJ

0

easist修正は単に整数に

num/Math.pow(10,i-1)%10; 

をキャストすることです。 Math.powは、二重のように定義されており、明示的にそれを伝えることなく、整数値にダブル値を変換しません。これはなぜ起こるかについては

int digit = (int) num/Math.pow(10,i-1)%10; 

を:あなたはそれの前に(int)を追加することによってこれを行うことができます。次のように

0

Math.powは二重を返し、式の他のすべてのオペランドは整数型です。コンパイラエラーを修正するには、他の答えに示すように、Math.powの結果をintに明示的にキャストします。

サイドノート。浮動小数点指数が不必要に高価なので、Math.powを使用してi-1の10乗を求めないでください。代わりに、これと同様に、反復ごとに10を掛け:

int r = 1; 
for(int i = 1; r < num; i++, r *= 10) { 
    int digit = num/r % 10; 
    // ... 
} 
関連する問題