- - PR -
490/4.9=99.99999
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-18 12:18
VB.NET 2003です。
人間系で計算したら、490/4.9=100 になるのですが、490/4.9=99.99999になります。 不動小数点数の有効桁数などが原因なんだとは、何となく分かるのですが、 明確な答えがわからなくて、モヤモヤ状態です。 回避方法も、分子分母に10をかけて整数にしてから計算すればいいのでいいのですが、やっぱりモヤモヤです。 ズバッと答えてもらえないでしょうか。 | ||||||||
|
投稿日時: 2005-11-18 12:46
siopさんこんにちは。
> VB.NET 2003です。 > ズバッと答えてもらえないでしょうか。 decimal型を使いましょう。 http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_007/cs2_007_02.html | ||||||||
|
投稿日時: 2005-11-18 12:47
「そういうもんだから」です。 4.9 を2進数で表記してみれば分かります。
回避の方法は「どんな答えを必要としているか」で変わります。 どんな場合にも当てはまる唯一無二の回答はありません。 | ||||||||
|
投稿日時: 2005-11-18 12:48
こんにちは。
具体的にどういうコードを書いたら、そうなりますか? 普通に結果が 100 になるので・・・。 _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2005-11-18 12:54
4.9 を二進数で表すと循環小数になるので誤差が発生します。
なので、十進型である Decimal を使ってください。
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2005-11-18 12:57
めちゃくちゃ回答被ってるw
Double 型や Single 型に入れないと再現しません。 例えば、直接 ToString などすると正しい結果になります。
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2005-11-18 12:58
あ、ウォッチでみたらなってました・・・。
結果をコンソールに出力したら、何故か 100 と表示しますね・・・。 これって親切なんですか〜? (Double.ToString() が 100 を返している・・・) _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2005-11-18 16:32
みなさま、ありがとうございます。モヤモヤが少し晴れました。
当然ながら割り算だけでなく、かけざんでも誤差がでますね。 4.9*100=490.00000000000006 そうなると、またモヤモヤが・・・(^^; Doubleの存在価値って何? 通常の変数は、Decimalを使いまくればいいのか? Decimalがなかったときには、どうだったの? ひどりさんの、 >回避の方法は「どんな答えを必要としているか」で変わります。 とありますが、4.9*100=490.00000000000006 という答えを必要とすることなんてあるのでしょうか? |