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

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

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

Re[4]: VB2008,四捨五入の方法について


(過去ログ 63 を表示中)

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

■36140 / inTopicNo.1)  VB2008,四捨五入の方法について
  
□投稿者/ hito (5回)-(2009/05/21(Thu) 19:30:25)

分類:[VB.NET/VB2005 以降] 

2009/05/21(Thu) 19:32:31 編集(投稿者)
お世話になります。hitoと申します。

現在、VB2008にてフォームの開発をしているのですが、
フォーム上にはDataGridViewを設置しています。
そして、そのDataGridViewには、数値のみを格納した列があります。

まず、その列のすべてのCellの値の合計値をします。
こちらがそのコードです。

	'列の合計を求める。
        Dim a As String = 0
        Dim s As Integer
        s = 0
        Dim i As DataGridViewRow
        For Each i In DataGridView_Sub.Rows
            If Not i.IsNewRow Then
                a = DataGridView_Sub(1, i.Index).Value
                If a <> "" Then
                    s = s + a
                End If
            End If
        Next i

一応上記のコードで合計値を求めることができます。
次にDataGridViewの1つのCellの値(数値型)を、上記のコードで求めた合計値で割り算をしたいと考えております。
こちらがそのソースになります。
         Dim Y As Integer
         Y = DataGridView_Sub.CurrentCellAddress.Y
         Dim b As Integer = 0
         Dim c As Integer = 0
         Dim DGV As Integer = 0
         DGV = DataGridView1(1, Y).Value
        b = (DGV / s)
         Round2(b)   '<---四捨五入を行う
         c = b * 80

仮に、s の値が「14」だとします。
そうしますと、b = (4 / s)の部分で、bの値が0.2857........となります。
やりたい作業は、b の値を算出した直後にbを四捨五入するという仕様を作りたいということなのですが、
四捨五入をする際の計算方法がよく分からないんです・・・。
一応サイトを見て回り、
このようなサンプルコードを発見いたしました。
   Function Round2(ByVal A As Double)    '四捨五入関数
        If A = 0 Then
            Round2 = 0
        ElseIf A > 0 Then
            Round2 = Int(A + 0.5)
        Else
            Round2 = -Int(-A + 0.5)
        End If
    End Function

こちらのソースで四捨五入が出来るかと思ったのですが、このファンクションを通ったあと、
どのようにして、元のイベントに戻り値を返したらよいかが分からないんです。
恐縮ですが、Functionを通過した後の、戻り値の取得方法を教えてはいただけないでしょうか。
よろしくお願いします。

引用返信 編集キー/
■36141 / inTopicNo.2)  Re[1]: VB2008,四捨五入の方法について
□投稿者/ 魔界の仮面弁士 (1081回)-(2009/05/21(Thu) 19:59:56)
No36140 (hito さん) に返信
> そして、そのDataGridViewには、数値のみを格納した列があります。
> まず、その列のすべてのCellの値の合計値をします。

DataTable/DataSet を割り当てている場合には、
 sumValue = DataTable1.Compute("SUM(列名)", "")
で、列の合計を得ることができます。
あるいは LINQ で「Aggregate 〜 In 〜 Into Sum(〜)」とか。


> Dim b As Integer = 0
>  b = (DGV / s)
これでは意味がありません。b は Integer 型ですので、代入時に整数に丸められてしまっています。

小数としての除算結果を得たいのであれば、Double や Decimal で受け取ってください。
なお、「Integer / Integer」の結果は Double となります。「Decimal / Decimal」なら Decimal です。

ちなみに、整数としての「商」を求めたい場合には、「/ 演算子」ではなく「\ 演算子」を使う事になります。


> Round2(b)   '<---四捨五入を行う
四捨五入が目的なら、Math.Round メソッドで AwayFromZero を指定すれば OK です。
引用返信 編集キー/
■36144 / inTopicNo.3)  Re[1]: VB2008,四捨五入の方法について
□投稿者/ s2n (3回)-(2009/05/22(Fri) 04:23:07)
s2n さんの Web サイト
No36140 (hito さん) に返信
> やりたい作業は、b の値を算出した直後にbを四捨五入するという仕様を作りたいということなのですが、
> 四捨五入をする際の計算方法がよく分からないんです・・・。
> 一応サイトを見て回り、
> このようなサンプルコードを発見いたしました。
>    Function Round2(ByVal A As Double)    '四捨五入関数
>         If A = 0 Then
>             Round2 = 0
>         ElseIf A > 0 Then
>             Round2 = Int(A + 0.5)
>         Else
>             Round2 = -Int(-A + 0.5)
>         End If
>     End Function
今試せる環境がないのですが、
このままだとエラーになりませんか?

> こちらのソースで四捨五入が出来るかと思ったのですが、このファンクションを通ったあと、
> どのようにして、元のイベントに戻り値を返したらよいかが分からないんです。
> 恐縮ですが、Functionを通過した後の、戻り値の取得方法を教えてはいただけないでしょうか。
Functionの使い方を調べると幸せになれると思います。
http://www.google.co.jp/search?hl=ja&q=vb+function+%96%DF%82%E8%92l

引用返信 編集キー/
■36148 / inTopicNo.4)  Re[2]: VB2008,四捨五入の方法について
□投稿者/ hito (6回)-(2009/05/22(Fri) 10:36:24)
魔界の仮面弁士さん
s2nさん
回答ありがとうございます。

魔界の仮面弁士さんからのご指摘どおり、
bに代入した時点で、小数ではない値となっておりました。
現在はDouble型として宣言し、小数の値として扱えるようにしております。

その後、四捨五入のソースなんですが、
以下のように出来上がりました。

    ' ------------------------------------------------------------------------
    '       指定した精度の数値に四捨五入します。
    '
    ' @Param    dValue      丸め対象の倍精度浮動小数点数。
    ' @Param    iDigits     戻り値の有効桁数の精度。
    ' @Return               iDigits に等しい精度の数値に四捨五入された数値。
    ' ------------------------------------------------------------------------
    Public Function ToHalfAdjust(ByVal dValue As Double, ByVal iDigits As Integer) As Double
        Dim dCoef As Double

        dCoef = (10 ^ iDigits)

        If dValue > 0 Then
            ToHalfAdjust = Int(CDbl(dValue * dCoef + 0.5)) / dCoef
        Else
            ToHalfAdjust = Fix(CDbl(dValue * dCoef - 0.5)) / dCoef
        End If
    End Function

ただ、自分で書いたわけではなく、サイトを見てそのまま引用してしまったものなので、
具体的な説明は出来ないのですが・・・
bを引数として渡す際、iDigitsという変数に小数の桁数を渡します。
例えば、
dValue = ToHalfAdjust(b, 1)であれば、

bの値を小数第一位まで四捨五入するという事になります。

一応、目的の四捨五入ができるようになりましたので、解決いたしました。
ありがとうございました。

解決済み
引用返信 編集キー/
■36153 / inTopicNo.5)  Re[3]: VB2008,四捨五入の方法について
□投稿者/ s2n (4回)-(2009/05/22(Fri) 11:52:21)
2009/05/22(Fri) 11:58:36 編集(投稿者)


解決済みになっていますが、情報共有を兼ねて
魔界の仮面弁士さんの回答を参考に調べてみました。

Math.Roundを利用すれば1行で済みますね。

Dim result As Double
'整数値に四捨五入
result = Math.Round(targetValue, 0, MidpointRounding.AwayFromZero)

上記の場合は、resultがDouble型になることに注意すればいいです。
http://msdn.microsoft.com/ja-jp/library/f5898377(VS.80).aspx

--
解決済みのチェックが漏れていたのでチェック
解決済み
引用返信 編集キー/
■36172 / inTopicNo.6)  Re[4]: VB2008,四捨五入の方法について
□投稿者/ hito (7回)-(2009/05/22(Fri) 16:07:31)
2009/05/22(Fri) 16:14:40 編集(投稿者)
2009/05/22(Fri) 16:14:26 編集(投稿者)

<pre><pre>■No36153 (s2n さん) に返信
>Math.Roundを利用すれば1行で済みますね。

>Dim result As Double
>'整数値に四捨五入
>result = Math.Round(targetValue, 0, MidpointRounding.AwayFromZero)

試しに行ってみたのですが、素晴らしいです。

すみません、私の調べ不足でした・・・。</pre></pre>
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -