DOBON.NET DOBON.NETプログラミング掲示板過去ログ

小数点の桁数の取得について

環境/言語:[Windows2000 VB.NET Framework1.1]
分類:[.NET]

またお世話になります。

また行き詰まっているので、ご意見を頂きたいです。

行いたい事
数値データ(浮動小数点あり)の少数のみの桁を取得したい。

現在のロジック
1.数値データを受け取り、整数値を取得する。
2.受け取った数値データ - 1で取得したデータ = 少数のデータ
3.2の結果データの桁数を取得する

問題点
2の結果がおかしい。
例、123.4-123.0=0.10000000000000853

本当は、「123.4-123.3=0.1」になってほしいのですが、上記のような結果と
なります。ちなみに、データ型があっていないのかなと思いコマンドウィンドウを
使用して結果を算出してみたのですが同じ結果でした。なぜこのような結果となるのか
わかりません。何か約束ごとを忘れていますでしょうか?

また別の方法として、小数点(".")の位置を見て桁数を取得する方法しかないでしょ
うか?何か、スマートではない気がするので嫌なんですが。

コマンドウィンドウの記述
?123.4-123.0

よろしくお願いいたします。

自己レスです。

すみません記述間違いがありました。

(誤)123.4-123.0
(正)123.4-123.3 

よろしくお願いいたします。
10進数の「1÷10」は、2進数では「1÷1010」と表せますよね。

これを小数で表した場合、10進表現では 0.1 として表現できますが、
2進数では、0.0001100110011……という循環小数になってしまいます。

System.SingleにしてもSystem.Doubleにしても、桁数を無限に保持できる
わけではありませんから、その分、どうしても誤差が生じます。
そのため、演算すると、その誤差が広がってしまい、このような結果となります。
(このあたりの細かい定義は、IEC 60559:1989 / IEEE 754 規格を参照のこと)


で、10進数表記での精度を必要とするなら、10進型(System.Decimal)を
用いてください。たとえば、VisualBasic.NET 2003 のイミディエイトでは

? 123.4F - 123.3F
0.0999984741
? 123.4R - 123.3R
0.10000000000000853
? 123.4D - 123.3D
0.1D

という結果となります。
ご回答ありがとうございました。魔界の仮面弁士さん。

早い回答で大変助かりました。また、私のお礼の返答が遅くなり申し訳ありません。

魔界の仮面弁士さんの言われたとおり、記述を行ったらうまく動作
しました。
まだ、いくつか疑問点があるのでじっくり調べたいと思います。

これからもよろしくお願いいたします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板