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

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

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

CeilingやFloorがDoubleを返す理由

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

■93357 / inTopicNo.1)  CeilingやFloorがDoubleを返す理由
  
□投稿者/ とり (1回)-(2019/12/07(Sat) 11:22:49)

分類:[.NET 全般] 

昔から疑問なのですが、
Math.CeilingやMath.Floor関数は切り下げや切り上げした整数を返す関数ですが、
なぜか返り値はdoubleになっているために、
そのままInteger変数に代入することができず
いちいちCintで整数化する必要があります。

なぜ、返り値をInteger型にしてくれないのでしょうか?

引用返信 編集キー/
■93358 / inTopicNo.2)  Re[1]: CeilingやFloorがDoubleを返す理由
□投稿者/ Hongliang (934回)-(2019/12/07(Sat) 11:32:14)
Doubleは最大で10^308ぐらいの値を格納できるので、IntegerでもLongでも桁が足りない可能性があります。
// もちろんそんな値だと小数点以下の桁なんか保持できないので、Ceiling等に渡す意味もなくなるのですが。
引用返信 編集キー/
■93360 / inTopicNo.3)  Re[1]: CeilingやFloorがDoubleを返す理由
□投稿者/ 魔界の仮面弁士 (2516回)-(2019/12/07(Sat) 20:33:30)
No93357 (とり さん) に返信
> Math.CeilingやMath.Floor関数は切り下げや切り上げした整数を返す関数ですが、
VB.NET や VBA の Int 関数も同様に、データ型は変換しませんね。

> なぜか返り値はdoubleになっているために、
Decimal の場合もありますよね。

> そのままInteger変数に代入することができず
> いちいちCintで整数化する必要があります。
丸め処理を行うための物であって、
データ型変換をおこなうための物では無いということです。


> なぜ、返り値をInteger型にしてくれないのでしょうか?
設計思想の話なので、いろいろな意見があるとは思いますが、以下、私の見解として:

利用側にとってみれば、丸め処理を行ったからといって、その後の処理が
整数で行われるとは限らないわけです。その後、割り算などの処理が続くような場合、
浮動小数点数のままにしておいた方が都合が良い場合もあります。

もしも Integer に変換されてしまうと、そこで小数除算割り算処理などが必要な場合、
コストや精度の面でデメリットになってします。あるいはデータサイズによっては
64bit 整数型(VBA なら LongLong)や、符号無し整数型が必要かもしれませんが、
それぞれの型ごとにメソッドを分けるのも冗長的かな、と。

ならば、丸め処理と型変換処理は別の機能として分けて設計した方が良い…という判断ではないでしょうか。
演算後に型変換の追加処理を行うのは、呼び出し側としてはさほど難しいことでは無いですし。


メソッドを分けないのだとしたら、浮動小数点数型と整数型のそれぞれを返す
「戻り値のみが異なるオーバーロード」を Math クラスに用意できれば解決するかもしれませんが、
そのようなメソッド定義だと VB や C# から利用できなくなりますし(MSIL レベルでは許可されているのですが)。
引用返信 編集キー/
■93393 / inTopicNo.4)  Re[2]: CeilingやFloorがDoubleを返す理由
□投稿者/ とり (2回)-(2019/12/09(Mon) 19:58:00)
そういう事情があったのですね
どうもありがとうございました

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ