web-dev-qa-db-ja.com

int vs round()関数に変数をキャストします

_(int)someValue_が不正確で、代わりにround()関数を呼び出す問題が発生したいくつかの場所で見ました。 2つの違いは何ですか?

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

25
cmp

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

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

更新

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

22
Levon
  1. intにキャストすると、浮動小数点数が切り捨てられます。つまり、小数部分が削除されます。
  2. round関数は、最も近い整数を返します。途中の場合はゼロから切り捨てられます。たとえば、round(-1.5)は_-2_で、round(1.5)は_2_です。

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 )。

(興味のある方のために、 here は丸めアルゴリズムの明確な紹介です。)

10
kol

特にCの場合、ほとんどの場合、切り捨てをキャストするのは事実ですが、必ず結果をテストして確認する必要があります。

キャストの問題は、OR round。のいずれかを切り捨てることができることです。それが行うことは、使用する特定のコンパイラにわずかに依存して、プログラミング言語に大きく依存します。それは常に適用されます。

Round()は、数学的な丸めに似た結果を生成するために広く使用されています。 .5のために特別に監視する必要があるEdgeのケースがあり、次の偶数に丸められる場合があります。

1
Sascha Rambeaud