web-dev-qa-db-ja.com

Javaでゼロにならないように小数に分割する方法は?

double[] arrayName = new double[10]; 
arrayName[0] = (14/49)*100;

14/49の2つの数値のパーセンテージを取得し、結果を配列に追加しようとしています。返されるのは0.0だけです。 doubleの代わりにfloatを使用しても同じです。 Javaは初めてです。

7
batoutofhell

intsをdoubleにキャストするか、doublesを使用します。

例えば:

double[] arrayName = new double[10]; 
resultValue[0] = (14.0/49.0)*100;

または:

double[] arrayName = new double[10]; 
resultValue[0] = ((double)14/49)*100;
11

見方:

(double/double)*double

JVMがそれをどのように見るか

(int/int)*int

[〜#〜] jls [〜#〜] から。 intからdoubleへの変換は拡大です。から §5.1.2

プリミティブ変換を拡張しても、数値の全体的な大きさに関する情報は失われません。

[...]

Intまたはlong値をfloatに変換したり、long値をdoubleに変換したりすると、精度が低下する可能性があります。つまり、値の最下位ビットの一部が失われる可能性があります。この場合、結果の浮動小数点値は、IEEE 754の最も近い丸めモードを使用して、整数値の正しく丸められたバージョンになります (§4.2.4)

それらの1つを二重リテラルに置き換えると(.0を追加したり、それらの1つをdoubleにキャストしたりすると、期待どおりの結果が得られるはずです。

6
Jason Sperske

このような:

arrayName[0] = (14/49)*100.0; // put ".0" after any of the numbers

またはこれ:

arrayName[0] = (double)(14/49)*100;
3
xagyg

値の少なくとも1つはdoubleである必要があります。

double[] arrayName = new double[10]; 
arrayName[0] = (14d/49d)*100;
// or...
// arrayName[0] = (14d/49)*100;
// or...
// arrayName[0] = (14/49d)*100;
// or...
// arrayName[0] = (14.0/49)*100;
// or...
// arrayName[0] = (14/49.0)*100;
// or...
// arrayName[0] = (14/(double)49)*100;
// or...
// arrayName[0] = ((double)14/49)*100;
// or...
// arrayName[0] = ((double)14/(double)49)*100;
3

他の多くの人が指摘しているように、定数をdoubleとして設定する必要があります。

arrayName[0] = (14*100)/49.0;

このようにして、最後の計算のみを最初の計算ではなくdoubleに変換し、浮動小数点計算の数を減らします。

ところで、必要に応じて、順序を交換し、除算の前に乗算を使用するのと同じ方法を使用して、結果を整数にすることもできます。たとえば、(14/49)* 100の代わりに14 * 100/49です。

2