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

mod演算子について

環境/言語:[windows XP VS2003]
分類:[.NET]

本掲示版には大変お世話になっております。
mod演算子を使用して小数値の倍数精度をチェックする処理を作成しようと
していますが、上手くいきません。

例えば入力値が1.5で単位が0.5単位の時はmodを使用する(1.5 mod 0.5)と
結果が0であるため正常と判断できますが、入力値が1.05で0.05単位で
実行する(1.05 mod 0.05)と結果が0になりません。
(Windowsの計算機を使用すると0となるのですが・・・)

mod演算子はWindowsの計算機の処理とは異なるのでしょうか?またWindowsの
計算機と同様な結果を得るにはどのようなどのように実現すればいいのでしょうか?

申し訳ございませんがよろしくお願い致します。
VB では、実数は通常 Double 型、つまり 2 進浮動小数点数で扱います。
で、2 進数による小数では、1.05 は循環小数になってしまいます。そのため、一見 1.05 でも実際には誤差が存在しています。当然、0.05(これも循環小数です)で除算したときの剰余は 0 になりません。
1.5 と 0.5 は 2 進小数で有限小数として記述できるので、剰余を正しく演算できるのですが。

数値がそう極端なもの(10 の 100 乗とか)でないのなら、各数値に Decimal 型を使えばいいでしょう。CDec で他の数値型などから変換することもできます。
Decimal 型は 10 進浮動小数点数を扱うため、1.05 や 0.05 も普段の感覚通り扱えます。
  • 題名: Re[2]: mod演算子について
  • 著者: 魔界の仮面弁士
  • 日時: 2009/09/08 22:03:19
  • ID: 25375
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
# 本題とは関係ないところに反応。

■No25374に返信(Hongliangさんの記事)
> Decimal 型は 10 進浮動小数点数を扱うため、

資料によっては、浮動小数点に分類されることも、
浮動小数では無いとされる事もあるようです。

[10 進型 (Decimal) (Visual Basic)]
http://msdn.microsoft.com/ja-jp/library/xtba3z33.aspx
》Decimal は浮動小数点型のデータ型ではありません。

http://msdn.microsoft.com/en-us/library/xtba3z33.aspx
》Decimal is not a floating-point data type.


[System.Decimal 構造体]
http://msdn.microsoft.com/ja-jp/library/system.decimal.aspx
》10 進数は、符号、値の各桁の範囲が 0 から 9 までの数値、数値の
》整数部と小数部を分ける浮動小数点の位置を示すスケール ファクタで
》構成される浮動小数点値です。

http://msdn.microsoft.com/en-us/library/system.decimal.aspx
》A decimal number is a floating-point value that consists of a sign,
》a numeric value where each digit in the value ranges from 0 to 9, and
》a scaling factor that indicates the position of a floating decimal point
》that separates the integral and fractional parts of the numeric value.

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