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

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

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

Re[3]: 桁数切捨ての関数について


(過去ログ 73 を表示中)

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

■42844 / inTopicNo.1)  桁数切捨ての関数について
  
□投稿者/ dakacho (1回)-(2009/10/22(Thu) 10:49:46)

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

http://jeanne.wankuma.com/tips/vb.net/math/rounddown.html

上記の桁数切捨て関数ですが、バグがないでしょうか?
520.31、2を引数に入れると結果が
520.30になります。
使用しているフレームワークは.Net 2.0、VB 2005 .netです
丸めはRoundの使用が妥当ではないでしょうか?

環境によって結果が違うのでしょうか?

引用返信 編集キー/
■42848 / inTopicNo.2)  Re[1]: 桁数切捨ての関数について
□投稿者/ 魔界の仮面弁士 (1359回)-(2009/10/22(Thu) 11:27:48)
2009/10/22(Thu) 14:28:34 編集(投稿者)

No42844 (dakacho さん) に返信
> 上記の桁数切捨て関数ですが、バグがないでしょうか?
Double 型を対象としているが故の動作です。

Double 型は、データを2進数で管理する仕様になっています。
10進数的に算出したいのであれば、Decimal の利用を検討してください。


> 520.31、2を引数に入れると結果が
> 520.30になります。
10進小数では、1÷10 といった値は正確に表現できますが、
1÷3 だと有限の桁数では表現できませんよね(3進数なら表現できます)。

それと同様、0.5 や 0.625 という値であれば、2進数でも表現できますが、
0.05 や 0.31 といった値を 2進数で表現する場合、有限の桁数では表しきれません。
そのため、実際には多少の誤差を含んだ値が使われることになります。


今回、Double の代わりに Decimal を使うことを提示しましたが、この場合、
計算式の途中で Double が混じる事が無いように考慮せねばなりません。

CDec 関数などを用いて、Double → Decimal や、Decimal → Double への
明示的/暗黙的変換を行ったところで、そもそも誤差のある値を変換しても、
その結果は「近似値」にしかならないためです。
Decimal を使う場合には、計算の最初から最後まで終始 Decimal で算出しましょう。
引用返信 編集キー/
■42850 / inTopicNo.3)  Re[2]: 桁数切捨ての関数について
□投稿者/ 774RR (416回)-(2009/10/22(Thu) 11:39:29)
http://bbs.wankuma.com/index.cgi?mode=al2&namber=26728&KLOG=49
この辺でもほぼ類似の議論が・・・
引用返信 編集キー/
■42858 / inTopicNo.4)  Re[3]: 桁数切捨ての関数について
□投稿者/ dakacho (2回)-(2009/10/22(Thu) 13:03:05)
>魔界の仮面弁士さん

大変詳細に説明していただき、有難うございました。
DecimalとDoubleの値の違いは明確に良く知りませんでした。
勉強になりました。ありがとうございます。
都合よく元々の値はDecimalで扱っていたので、ご指摘のとおり、
Decimalで処理するように変えたところ、期待通りの
値を得ることができました。

Public Shared Function ToRoundDown(ByVal dValue As Decimal, ByVal iDigits As Integer) As Decimal
Dim dCoef As Decimal = CDec(System.Math.Pow(10, iDigits))

If dValue > 0 Then
Return System.Math.Floor (dValue * dCoef) / dCoef
Else
Return System.Math.Ceiling(dValue * dCoef) / dCoef
End If
End Function

有難うございました。

No42850 (774RR さん) に返信
> http://bbs.wankuma.com/index.cgi?mode=al2&namber=26728&KLOG=49
> この辺でもほぼ類似の議論が・・・

後で気がつきました…そのようでした。
よく調べてから書き込めばよかったです。
どうもお騒がせしましてすいませんでした…m(_ _)m


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


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

このトピックに書きこむ

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

管理者用

- Child Tree -