1

浮動小数点値のみを含む char * を float 型に変換しようとしていますが、sscanf_s と atof の両方で同じ無効な結果が生成されます。

char t[] = "2.10";
float aFloat( 0.0f ), bFloat( 0.0f );

sscanf_s( t, "%f", &aFloat );
bFloat = atof( t );

出力:

aFloat: 2.09999990
bFloat: 2.09999990

答えを確認するために同様の質問を見たとき、私はそれらの解決策を試みましたが無駄でした.

char* を float または double に変換する

ここで与えられた解決策は、「stdlib.h」を含めることでした。その後、atof への呼び出しを明示的な呼び出し「std::atof」に変更しましたが、それでもうまくいきません。

4

2 に答える 2

3

残念ながら、すべての浮動小数点値をバイナリ形式で明示的に表現できるわけではありません。と言ったら同じ結果になります。

float myValue = 2.10;
于 2016-07-11T16:49:58.810 に答える
3

コメントの優れた回答が欠落している(または簡単に見つけられなかった)のに対処する方法がもう1つあります。

なぜ浮動小数点数が必要なのか、書いておくべきでした。たまたま金額を扱ってしまった場合 (そしてそれほど大きな額ではない場合)、入力値のカスタム パーサーと値出力用のカスタム フォーマッターを作成して、64b 整数 (*100) として読み取り、全体で作業することができます。 100*amount 値のアプリケーション。本当に膨大な量を扱っている場合は、大きな数値用のライブラリを使用するか、独自のライブラリを作成して char* 数値を操作することもできます。

これは固定小数点演算の特殊なケースです。

「これを解決するためだけに」興味がある場合は、あまりコーディングせずに、とにかく大きな数のライブラリに向かいます。* 100 の固定小数点バリアントでさえ、バグで簡単に作成できます-初めてで、持っていない場合正しく実行するのに十分なリソース (TDD をお勧めします)。

ただし、数値がコンピューターに格納される方法と、float/double ですべての数値を表現できない理由を確実に学んでください。コンピュータの浮動小数点数 (2.1内部で使用される基数 2) は、人間の と同様のケース1/3であり、小数点以下の桁数が無限でないと基数 10 で表すことができません (基数 10 で1.0==となる方法0.99999...)。(ありがとう@tobi303)


あなたの新しいコメントを読んだ後、「これは金融アプリケーションに大きな影響を与えませんか?」

回答: いいえ、影響はありません。まともな (そして専門家である) 人は、フロートまたはダブルを使用して金融アプリケーションを作成することはありません。

于 2016-07-11T16:59:55.217 に答える