4

私はJavaで、数学を実行し、ユーザーに手順を示すWebアプリを構築しています。小数を使用して基本的な算術演算を行うと、正確な出力が乱雑になることがよくあります。

これが私の問題です:

double a = 0.15;
double b = 0.01;
System.out.println(a - b);
// outputs 0.13999999999999999

float a = 0.15;
float b = 0.01;
System.out.println(a - b);
// outputs 0.14

float a = 0.16f;
float b = 0.01f;
System.out.println(a - b);
// outputs 0.14999999

double a = 0.16;
double b = 0.01;
System.out.println(a - b);
// outputs 0.15

completeどちらも正確さについては信頼できません。より正確な数値クラスはありますか、それとも値を四捨五入する必要がありますか?

4

4 に答える 4

6

これにはBigDecimalを使用できます。それは醜いですが、それは機能します:

BigDecimal a = new BigDecimal("0.15");
BigDecimal b = new BigDecimal("0.01");
System.out.println(a.subtract(b));

必ず、Stringパラメーターを使用するか、次のvalueOfようなメソッドを使用して作成してください。

BigDecimal x = new BigDecimal("0.15");   // This is ok
BigDecimal x = BigDecimal.valueOf(0.15); // This is also ok

そして、次のように、doubleパラメーターを使用しないでください。

BigDecimal x = new BigDecimal(0.15); // DON'T DO THIS

doubleを渡すと、doubleの不正確さも新しいBigDecimalインスタンスに渡されるためです。文字列を渡すと、BigDecimalは™を認識し、正しいこと™を実行します。

于 2012-08-29T07:16:39.537 に答える
2

を使用する場合は、適切なラウンドを適用する必要がありますdouble。そうすれば、ほとんどの場合十分すぎる15桁の精度を得ることができます。

double a = 0.15;
double b = 0.01;
System.out.printf("%.2f%n", a - b);

double a2 = 0.16;
double b2 = 0.01;
System.out.printf("%.2f%n", a2 - b2);

プリント

0.14
0.15
于 2012-08-29T07:23:14.287 に答える
1

BigDecimalはどうですか?

ただし、すべての部門(1/3など)で完全に正確になるわけではありません。そのためには、JDKの一部ではないが、たとえば2つの整数(またはBigIntegers)として簡単に実装できる分数が必要になります。

于 2012-08-29T07:17:18.690 に答える
0
  BigDecimal  a = new BigDecimal(".15");
  BigDecimal  b = new BigDecimal(".01"),
  BigDecimal  c = new BigDecimal(0);

  c = a.subtract(b);      
  System.out.println(c);
于 2012-08-29T07:23:31.450 に答える