2

私はJavaを使用しており、「double」データ型を参照しています。短くするために、コードでdoubleとして読み取った標準入力からいくつかの値を読み取っています(BigIntegerのようなものを使用したいのですが、現在は不可能です)。

ユーザーからdouble値を取得することを期待していますが、次のように入力する場合があります。99999999999999999999999999999.9999999999これはdoubleの正確な表現を超えており、1.0E27に丸められます(おそらく)。

特定の値をdoubleで正確に表すことができず、丸めが必要になるかどうかを検出する方法について、いくつかの指針を取得したいと思います(その値または他のそのようなアクションを拒否できるようにするため)。

どうもありがとうございます

4

3 に答える 3

4

人間が入力するほとんどの値は、doubleで正確に表すことはできません。

たとえば、ユーザーが0.1を入力できないようにしますか?これは、doubleとして正確に表現できるわけではありません。

エラーの規模を見つけるには、次のようにします。

BigDecimal userAsDecimal = new BigDecimal(userInput);
double userAsDouble = double.parseDouble(userInput);
BigDecimal doubleToDecimal = new BigDecimal(userAsDouble);
BigDecimal error = userAsDecimal.subtract(userAsDouble).abs();

次に、「エラー」が許容できるほど小さいかどうかを確認します。

于 2008-11-06T13:21:42.523 に答える
2
double orig = GetSomeDouble();
double test1 = orig - 1;
if ( orig == test1 )
   SomethingIsWrong();
double test2 = test1 + 1;
if ( orig != test2 )
   SomethingIsWrong();
于 2008-11-06T13:22:58.743 に答える
1

doubleを使用して、要求どおりに正確に何かを格納することはできません。ユーザーがdoubleで完全に表すことができる数値を入力することはめったにありませんが、それは偶然の一致です。正確な数値を格納する必要がある場合は、操作を行う必要がない限り、文字列を使用できます。それ以上のものが必要な場合は、おそらくその種の正確な数学のために作られたライブラリがあります。

于 2008-11-06T13:40:52.313 に答える