33

私はいくつかの場所でそれを見て(int)someValueきましたが、それは不正確であり、代わりに問題がround()関数に呼び出されました。2つの違いは何ですか?

具体的には、必要に応じて、C99 C の場合です。Java でプログラムを作成するときに、プログラムで同じ問題が発生することもありました。

4

2 に答える 2

28

float/double値をにキャストする場合、int通常、整数の切り捨てにより小数部分が失われます。

これは、通常予想される丸めとはまったく異なります。たとえば、2.1 が 2 になるのと同様に、2.8 は整数切り捨てで 2 になります。

更新

キャストに関する潜在的な (全体的な) 不正確さのもう 1 つの原因は、浮動小数点型ではなく整数で表現できる値の範囲が限られているためです (以下のコメントでこれについて思い出させてくれた @R に感謝します)。

于 2012-06-20T21:54:55.660 に答える
15
  1. キャストしintて浮動小数点数を切り捨てます。つまり、小数部分を削除します。
  2. このround関数は最も近い整数を返します。中途半端な場合はゼロから四捨五入されます。たとえば、round(-1.5)is-2round(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)では変更されていません。

(興味のある方のために、ここに丸めアルゴリズムの明確な紹介があります。)

于 2012-06-20T21:55:51.150 に答える