私はいくつかの場所でそれを見て(int)someValue
きましたが、それは不正確であり、代わりに問題がround()
関数に呼び出されました。2つの違いは何ですか?
具体的には、必要に応じて、C99 C の場合です。Java でプログラムを作成するときに、プログラムで同じ問題が発生することもありました。
float
/double
値をにキャストする場合、int
通常、整数の切り捨てにより小数部分が失われます。
これは、通常予想される丸めとはまったく異なります。たとえば、2.1 が 2 になるのと同様に、2.8 は整数切り捨てで 2 になります。
更新:
キャストに関する潜在的な (全体的な) 不正確さのもう 1 つの原因は、浮動小数点型ではなく整数で表現できる値の範囲が限られているためです (以下のコメントでこれについて思い出させてくれた @R に感謝します)。
int
て浮動小数点数を切り捨てます。つまり、小数部分を削除します。 round
関数は最も近い整数を返します。中途半端な場合はゼロから四捨五入されます。たとえば、round(-1.5)
is-2
とround(1.5)
is2
です。 7.12.9.6ラウンド関数
あらすじ
#include <math.h> double round(double x); float roundf(float x); long double roundl(long double x);
説明
関数は
round
、現在の丸め方向に関係なく、引数を浮動小数点形式の最も近い整数値に丸め、ゼロから半分のケースを丸めます。戻り値
関数は
round
丸められた整数値を返します。
出典:C99標準(ISO / IEC 9899:1999)。このセクションは、C11標準(ISO / IEC 9899:2011)では変更されていません。
(興味のある方のために、ここに丸めアルゴリズムの明確な紹介があります。)