浮動小数点は、実際には2進数(2進数)で表されています。これの1つの結果は、0.1
小数(別名小数点以下は1/10
)を浮動小数点で正確に表すことができないことです。
1/3
は固定小数点数で正確に表すことはできません - それは無限に繰り返される値0.3333333.....
であり、有限数の場所に切り捨てるとエラーが発生します。唯一の違いは、1/10
は、基数2の無限に反復する値です。したがって、2進数の有限数では正確に表すことはできません。
このような方法で影響を受ける値は明らかです(0.2
、0.6
など)。このようなエラーは、浮動小数点表記の固有の性質です。つまり、別の言い方をすれば、浮動小数点は近似値を表します(精度が低い可能性のある値)。また、一連の計算を実行するときに、値のエラーが伝播します。
0.1
を浮動小数点(および他の値)で正確に表す方法がないため、浮動小数点値をデータベースに正確に格納して正確に0.1
の値を取得する方法はありません。
あなたは、このような
#include <sstream>
#include <iomanip>
#include <string>
std::ostringstream o;
o << std::fixed << std::setprecision(2) << result;
std::string s=o.str();
として、出力の精度を制限した方法で値を印刷してみてくださいクマは念頭に置いて、これがフォーマットされているか
result
を制御する(例えば、この場合は、文字列への出力に)。
result
の値は変更されません。
概念的には、文字列s
をデータベースに格納することができます。フィールドが数値ではなく文字列を表す場合。
これがなぜ起こっているのか疑問に思っている場合:[浮動小数点数学は壊れていますか?](http://stackoverflow.com/q/588004/669576)。 –
値 '47.6'は2進浮動小数点型では存在しません。近似値しか得られません。あなたのデータベースタイプは何ですか? – hvd
浮動小数点数がどのようにメモリに格納されるかについて、すべてのプログラマが理解する必要があることについて学びます。 – DeiDei