double に変換された文字列に対していくつかの操作を実行した後、double の精度に問題があります。
#include <iostream>
#include <sstream>
#include <math.h>
using namespace std;
// conversion function
void convert(const char * a, const int i, double &out)
{
double val;
istringstream in(a);
in >> val;
cout << "char a -- " << a << endl;
cout << "val ----- " << val << endl;
val *= i;
cout << "modified val --- " << val << endl;
cout << "FMOD ----- " << fmod(val, 1) << endl;
out = val;
return 0;
}
これは、文字列として入力されたすべての数値に当てはまるわけではないため、エラーは一定ではありません。一部の数値にのみ影響します (34.38 は定数のようです)。
現時点で、a = 34.38 および i=100 を渡すと、次のように返されます。
char a -- 34.38
Val ----- 34.38
modified val --- 3438
FMOD ----- 4.54747e-13
精度が低いため、Valをfloatに変更すると機能しますが、doubleが必要です。
これは、sstream の代わりに atof、sscanf、strtod を使用した場合にも再現されます。
C++ で、文字列を double に正しく変換し、実際に正確な値を返す最良の方法は何ですか?
ありがとう。