- PR -

490/4.9=99.99999

投稿者投稿内容
siop
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 67
投稿日時: 2005-11-18 12:18
VB.NET 2003です。

人間系で計算したら、490/4.9=100 になるのですが、490/4.9=99.99999になります。
不動小数点数の有効桁数などが原因なんだとは、何となく分かるのですが、
明確な答えがわからなくて、モヤモヤ状態です。

回避方法も、分子分母に10をかけて整数にしてから計算すればいいのでいいのですが、やっぱりモヤモヤです。

ズバッと答えてもらえないでしょうか。
なか-chan@最愛のiMac
ぬし
会議室デビュー日: 2002/07/17
投稿数: 385
お住まい・勤務地: 和光市・世田谷区
投稿日時: 2005-11-18 12:46
siopさんこんにちは。

> VB.NET 2003です。

> ズバッと答えてもらえないでしょうか。

decimal型を使いましょう。
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_007/cs2_007_02.html
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-11-18 12:47
引用:

人間系で計算したら、490/4.9=100 になるのですが、490/4.9=99.99999になります。
不動小数点数の有効桁数などが原因なんだとは、何となく分かるのですが、
明確な答えがわからなくて、モヤモヤ状態です。



「そういうもんだから」です。
4.9 を2進数で表記してみれば分かります。

引用:

回避方法も、分子分母に10をかけて整数にしてから計算すればいいのでいいのですが、やっぱりモヤモヤです。



回避の方法は「どんな答えを必要としているか」で変わります。
どんな場合にも当てはまる唯一無二の回答はありません。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-18 12:48
こんにちは。

具体的にどういうコードを書いたら、そうなりますか?
普通に結果が 100 になるので・・・。

_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-18 12:54
4.9 を二進数で表すと循環小数になるので誤差が発生します。
なので、十進型である Decimal を使ってください。

コード:

Dim d1 As Double  = 490 / 4.9      '99.9999...
Dim d2 As Decimal = 490D / 4.9D    '100


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-18 12:57
めちゃくちゃ回答被ってるw

引用:

囚人さんの書き込み (2005-11-18 12:48) より:

具体的にどういうコードを書いたら、そうなりますか?
普通に結果が 100 になるので・・・。


Double 型や Single 型に入れないと再現しません。
例えば、直接 ToString などすると正しい結果になります。

コード:

MessageBox.Show( (490 / 4.9).ToString("#,##0.00") )


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-18 12:58
あ、ウォッチでみたらなってました・・・。
結果をコンソールに出力したら、何故か 100 と表示しますね・・・。
これって親切なんですか〜?
(Double.ToString() が 100 を返している・・・)
_________________
囚人のジレンマな日々
siop
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 67
投稿日時: 2005-11-18 16:32
みなさま、ありがとうございます。モヤモヤが少し晴れました。

当然ながら割り算だけでなく、かけざんでも誤差がでますね。

4.9*100=490.00000000000006

そうなると、またモヤモヤが・・・(^^;

Doubleの存在価値って何?
通常の変数は、Decimalを使いまくればいいのか?
Decimalがなかったときには、どうだったの?

ひどりさんの、
>回避の方法は「どんな答えを必要としているか」で変わります。

とありますが、4.9*100=490.00000000000006 という答えを必要とすることなんてあるのでしょうか?

スキルアップ/キャリアアップ(JOB@IT)