C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 数値の小数点について


(過去ログ 68 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■39847 / inTopicNo.1)  数値の小数点について
  
□投稿者/ Key (17回)-(2009/08/14(Fri) 15:59:06)

分類:[.NET 全般] 

ある値Xを求めるために
long A = 3000;
long B = 2000;
int C = 300;
float X = (float)((A-B)/C));
結果を3.33333....と表示したいのですが
デバックで見たところ3と切り捨てられていたのですが
キチンと小数点以下も反映できますか?

引用返信 編集キー/
■39849 / inTopicNo.2)  Re[1]: 数値の小数点について
□投稿者/ επιστημη (2116回)-(2009/08/14(Fri) 16:06:56)
επιστημη さんの Web サイト
2009/08/14(Fri) 16:24:43 編集(投稿者)

No39847 (Key さん) に返信
> ある値Xを求めるために
> long A = 3000;
> long B = 2000;
> int C = 300;
> float X = (float)((A-B)/C));
> 結果を3.33333....と表示したいのですが
> デバックで見たところ3と切り捨てられていたのですが

intで結果が出たあとでfloatにキャストしても時すでに遅し。
[追記]↑longのマチガイ。 サーセン

> キチンと小数点以下も反映できますか?

たとえば
float X = (float)(A-B)/C;

引用返信 編集キー/
■39850 / inTopicNo.3)  Re[1]: 数値の小数点について
□投稿者/ .SHO (1008回)-(2009/08/14(Fri) 16:09:04)
> float X = (float)((A-B)/C));

(A-B)/C の計算を long で実施して(この時点の結果はlongなので「3」)
それを float にして(「3」をfloatにしても「3」)Xに代入してます。

float X = ( (float) (A-B) ) / (float) C;

で「3.3333…」になります。
引用返信 編集キー/
■39851 / inTopicNo.4)  Re[2]: 数値の小数点について
□投稿者/ みきぬ (613回)-(2009/08/14(Fri) 16:10:19)
時には過去に立ち返るのも悪くないと思うんだ、うん。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=39376#17
引用返信 編集キー/
■39852 / inTopicNo.5)  Re[1]: 数値の小数点について
□投稿者/ 魔界の仮面弁士 (1217回)-(2009/08/14(Fri) 16:11:22)
No39847 (Key さん) に返信
> long A = 3000;
> long B = 2000;
> int C = 300;
> float X = (float)((A-B)/C));
括弧の対応がおかしいような…。


> デバックで見たところ
デバッ「グ」かな。< Debug


> 3と切り捨てられていたのですが
string s1 = (A - B).GetType().FullName;
を実行してみると分かりますが、「A - B」の結果は、long 型(System.Int64型)です。

そして、「long / int」の結果は、long となります。
string s2 = ((A - B) / C).GetType().FullName;

そのため、演算結果に小数部は存在しません。
それを後から float にキャストしても、小数部は存在しないままです。



> キチンと小数点以下も反映できますか?
「int / int」「long / int」「long / long」などではなく、
「float / float」「decimal / decimal」などにすれば、小数部も得られます。

ですので、(float) へのキャストの位置を変更してみてください。
(または、A〜C の各変数を非整数型にしても OK かと)


なお float 型の場合、内部的には 2 進小数で管理されています。

0.5、0.25、0.75、0.125 といった値であれば、誤差無く保持できますが、
0.1、0.3、0.7、0.01 といった値は、微妙な誤差を含む可能性がある点に注意してください。
引用返信 編集キー/
■39853 / inTopicNo.6)  Re[2]: 数値の小数点について
□投稿者/ .SHO (1009回)-(2009/08/14(Fri) 16:11:25)
# やっぱ、επιστημηさんとカブったか…
# 急いで打ちこんだのに(笑)
引用返信 編集キー/
■39854 / inTopicNo.7)  Re[3]: 数値の小数点について
□投稿者/ Key (19回)-(2009/08/14(Fri) 16:36:31)
ありがとうございました。
キャストが計算した値全体におこるものだと思っていました。
解決済み
引用返信 編集キー/
■39895 / inTopicNo.8)  Re[4]: 数値の小数点について
□投稿者/ επιστημη (2117回)-(2009/08/17(Mon) 09:05:35)
επιστημη さんの Web サイト
> キャストが計算した値全体におこるものだと思っていました。

そうですよ?
((A-B)/C) によって計算結果が long で求まり、
それをfloatにキャストしたんです。


引用返信 編集キー/
■39912 / inTopicNo.9)  Re[5]: 数値の小数点について
□投稿者/ Jitta on the way (389回)-(2009/08/17(Mon) 22:09:53)
No39895 (επιστημη さん) に返信
>>キャストが計算した値全体におこるものだと思っていました。
>
> そうですよ?
> ((A-B)/C) によって計算結果が long で求まり、
> それをfloatにキャストしたんです。
>
>

ん〜、多分、

(float)((A-B)/C)

((float)A-(float)B)/(float)C

が、等しいと考えていた、という意味かと。
引用返信 編集キー/
■39925 / inTopicNo.10)  Re[6]: 数値の小数点について
□投稿者/ ふくちゃん (49回)-(2009/08/18(Tue) 09:01:56)
ですね。


> (float)((A-B)/C)

これは

long A = 3000;
long B = 2000;
int C = 300;

ですので、このまま計算すると、

(float)((3000-2000)/300)
(float)( 1000/300 )
(float)(3)     ←整数型の割り算結果は小数点以下切り捨てです。
3.0

となります。
解決策はJitta on the way さんのいうとおり、
割る前にfloat型にする。ことですね。

( (float)1000/(float)300 )= 3.333333
( 1000/300 )= 3
(float)( 1000/300 )= 3.0






> と
> ((float)A-(float)B)/(float)C
>
> が、等しいと考えていた、という意味かと。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -