Top > プログラミング > .NET Tips> 小数(浮動小数点数型)の計算が思った結果にならない理由と解決法

小数(浮動小数点数型)の計算が思った結果にならない理由と解決法」への評価、コメント

評価

良い / 悪い = 93 / 2 (「良い」の割合 = 0.979 , 人気度 = 1.936

評価する

コメント一覧


通常のコメント
nicopun 2019/12/19 (Thu) 22:13:20
浮動小数点数の一致判定には計算機イプシロン(「1より大きい最小の数」と1との差)を活用した判定式を用いますが,Double.Epsilonは計算機イプシロンではないそうです.

IEEE 754規格binary64形式での計算機イプシロンは約2.22E-16なのに対して,
Double.Epsilonは4.94065645841247E-324と定義されています.こちらはゼロより大きい最小の非正規化数だそうです.

よって,.NETでは自前で計算機イプシロンを定義して使用するのが良いようです.素人が調べた範囲のことなので不正確かもしれませんが,合っているようでしたら記事への反映をご検討ください.

通常のコメント
H.Hidaka 2015/12/21 (Mon) 13:28:06
decimal を使ったことがなかったので、delphiのCurrency型の機能を探していました。ありがとうございます。
decimal をベースに、Currencyクラスを作成し、
基本はdecimalで、最後に取り込むときに、
(Math.Round(value, 15))で返すcurrencyプロパティを作り使えるかなと思ってます。
以下、Currencyクラスの一部分を付けます。
---------------------------------------
public class Currency
{
decimal value;
public decimal currency
{
get { return (Math.Round(value, 15)); }
set { this.value = Math.Round(value, 21); }
}
public Currency(decimal inData)
{
this.value = Math.Round(inData, 21);
}
public static Currency operator +(Currency z, Currency w)
{
return new Currency(z.value + w.value);
}
public static Currency operator +(Currency z, int w)
{
return new Currency(z.value + w);
}
以下、 + - * / の operator を同様に作成する。

評価の理由
dsn 2015/10/25 (Sun) 18:32:26
評価:良い
初心者です。出力が思った通りに出なくて、「微小な誤差のせいかな」「そういえばsingleなんて使うなって言っていた人がいたな」と思って調べていたらここに来ました。
大変参考になりました。ありがとうございました

評価の理由
thom 2015/09/3 (Thu) 21:26:14
評価:良い
コンピューターが小数を正しく扱えないことは知っていましたが、まさか0.1+0.2で間違うとは。。
面白い記事です。

評価の理由
張子房 2014/05/23 (Fri) 20:03:47
評価:良い
簡潔で見易く分かり易かったです。

評価の理由
K.Oumi 2014/02/4 (Tue) 10:30:04
評価:良い
すばらしいまとめです。

通常のコメント
怠惰を求めて勤勉に行きつく 2014/01/20 (Mon) 16:40:24
助かりまっサー

評価の理由
K.Oumi 2013/10/30 (Wed) 09:33:16
評価:良い
Good!

通常のコメント
aa 2012/06/27 (Wed) 17:33:03
非常に助かる

評価の理由
古い開発者 2012/04/13 (Fri) 15:29:53
評価:良い
大変参考になりました。詳しく書いていただき勉強もたくさんできました。ありがとうございました。

コメントの投稿

[説明]