2016-12-30 9 views
0

でゼロ値、避けるジャンク私の下のプログラムで二重の変数

main 
{ 
    // value is 476 
    int value = 476; 

    // here dimension shows as 0.100000001 
    float dimension = 0.1f; 



/// Here I am expecting value as 47.6, 
/// But it gives value as 47.600002288818...... 
double result = value * dimension; 
} 

私はそう期待値を取得するための任意のinbuild機能があり、直接データベースに値を保存したいですか?期待

:47.6の代わりに、47.600002288を.....

+4

これがなぜ起こっているのか疑問に思っている場合:[浮動小数点数学は壊れていますか?](http://stackoverflow.com/q/588004/669576)。 –

+3

値 '47.6'は2進浮動小数点型では存在しません。近似値しか得られません。あなたのデータベースタイプは何ですか? – hvd

+0

浮動小数点数がどのようにメモリに格納されるかについて、すべてのプログラマが理解する必要があることについて学びます。 – DeiDei

答えて

3

いくつかの方法がありますが、すべての場合において、浮動小数点値の表す精度の桁数を決定して決定する必要があります。 floatについては、「私は実際に0.100000001の代わりに.1」と書いてあります。

値を2桁の精度で指定すると決めたら、それらを切り捨てる方法はいくつかあります。

#include <sstream> 
#include <iomanip> 

std::ostringstream o; 

    o << std::setiosflags(std::ios::fixed) << std::setprecision(2) << 0.1; 

std::string s=o.str(); 

あなたは今sに「0.10」を検索します:1つの簡単な方法は、ストリームのフォーマットを使用することです。

計算の結果、精度の桁数がわからない場合は、固定精度演算専用のライブラリlike GMPを使用してください。

-1

値は精度のため47.600002288に格納されていますが、それを使用したいときに値場合は、たとえば、浮動小数点の後にちょうどN桁を使用することができますprintf使用中(47.600002288)です:

printf("%.2f\n", result); 

これは浮動小数点の後に2番号を印刷するには、フォーマット機能を教えて.2%後に気づく、47.60を印刷します。あなたがsprintfを使用して文字列に直接印刷することができ

注:私は、これは文字の長さが下か同じでなければならないことを意味sizeof(char)*10使用mallocパラメータに注意する必要があり、この場合には

char s= malloc(sizeof(char)*10); 
sprintf(s, "%.2f\n", result); 
//s contains "47.60" 

9(最後の文字は文字列終了文字のために予約されています。\0)。

0

浮動小数点は、実際には2進数(2進数)で表されています。これの1つの結果は、0.1小数(別名小数点以下は1/10)を浮動小数点で正確に表すことができないことです。

1/3は固定小数点数で正確に表すことはできません - それは無限に繰り返される値0.3333333.....であり、有限数の場所に切り捨てるとエラーが発生します。唯一の違いは、1/10は、基数2の無限に反復する値です。したがって、2進数の有限数では正確に表すことはできません。

このような方法で影響を受ける値は明らかです(0.20.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をデータベースに格納することができます。フィールドが数値ではなく文字列を表す場合。

関連する問題