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

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

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

Re[2]: VB.Netでの小数の値


(過去ログ 87 を表示中)

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

■51922 / inTopicNo.1)  VB.Netでの小数の値
  
□投稿者/ Ya (1回)-(2010/07/26(Mon) 16:13:01)

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

開発環境
OS:WindowsVista
言語:VisualStudio2008 VB.Net

上記環境で
@4.98 = System.Math.Floor((4.975 * 100) + 0.5) / 100
の答えを出したいのですが、
A4.97 = System.Math.Floor((4.975 * 100) + 0.5) / 100
となってしまいます。

@の値を取得したいのですが、
(4.975 * 100)の計算値が497.49999999999994
となるため、Aの値しか取れません。

原因または対処方をご存じであれば
お教えください。
よろしくおねがいします。
引用返信 編集キー/
■51925 / inTopicNo.2)  Re[1]: VB.Netでの小数の値
□投稿者/ 魔界の仮面弁士 (1718回)-(2010/07/26(Mon) 16:36:18)
No51922 (Ya さん) に返信
> 4.98 = System.Math.Floor((4.975 * 100) + 0.5) / 100
今回の場合、データ型が問題になっています。


> 対処方をご存じであれば
「対処法」は、Decimal 型を使うことです。

たとえば、今回の式であれば、
 Dim d As Decimal = System.Math.Floor((4.975D * 100D) + 0.5D) / 100D
もしくは
 Dim d As Decimal = System.Math.Floor((4.975@ * 100@) + 0.5@) / 100@
という式にすれば、4.98 という結果が得られます。


> 原因または対処方をご存じであれば
4.975 というリテラル値は、VBにとっては Double 型 として認識されます。
4.975D や 4.975@ というリテラル値は、Decimal 型 として認識されます。

我々が普段使っている小数は 10進数のものですが、Double 型は 2進小数を扱う物です。
一方、Decimal 型は 10進数を扱うためのものなので、こういう場合に都合が良いのです。

0.5 という値は、2進数では 0.1 という「割り切れる値」になるのですが、
4.975 という値は、2進数では 100.11111001100110011…という値になるため、
実際には「近似値」として格納されています(管理できる桁数は有限なので)。
これが誤差として現れるということですね。
引用返信 編集キー/
■51928 / inTopicNo.3)  Re[2]: VB.Netでの小数の値
□投稿者/ Ya (2回)-(2010/07/26(Mon) 17:26:36)
魔界の仮面弁士様

ご回答の内容で理解し解決できました。
とても助かりました。ありがとうございます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -