web-dev-qa-db-ja.com

分数の損失の可能性

これが素朴な質問なら許してください、しかし今日私は途方に暮れています。

次のような単純な除算計算があります。

double returnValue = (myObject.Value / 10);

値はオブジェクトのintです。

分数が失われる可能性があるというメッセージが表示されます。ただし、doubleをintに変更すると、メッセージは消えます。

なぜこれが起こるのかについての考えはありますか?

114
CodeLikeBeaker

2つのintを浮動小数点値に分割すると、小数部分は失われます。アイテムの1つをフロートにキャストすると、このエラーは発生しません。

たとえば、10を10.0に変えます

double returnValue = (myObject.Value / 10.0);
160
Ólafur Waage

myObject.Valueの両側が整数型であるため、/がintの場合、整数除算を実行しています。

浮動小数点除算を行うには、式の数値の1つが浮動小数点型である必要があります。 myObject.Valueがdoubleの場合、または次のいずれかである場合、これは当てはまります。

double returnValue = myObject.Value / 10.0;
double returnValue = myObject.Value / 10d; //"d" is the double suffix
double returnValue = (double)myObject.Value / 10;
double returnValue = myObject.Value / (double)10;
57
lc.

整数を整数で除算すると、整数が返されます。 Valueをdoubleにキャストするか、10.0で除算します。

7
Cambium

仮定して myObject.Valueint、方程式myObject.Value / 10は整数の除算で、倍精度にキャストされます。

つまり、myObject.Valueが12の場合、returnValueは1になりますnot 1.2。

最初に値をキャストする必要があります。

double returnValue = (double)(myObject.Value) / 10.0;

これにより、正しい値1.2が得られます。少なくとも、doubleが制限を与えれば許されるのと同じくらい正確ですが、それはSOの他の場所でほぼ無限に議論されています:-)。

7
paxdiablo

MyObjectはintであるため、

double returnValue=(myObject.Value/10.0); 
4
segfault