- PR -

490/4.9=99.99999

投稿者投稿内容
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-11-19 10:11
引用:

OUTPUTを人間が見るものの場合、doubleは使えないってことかな。



時と場合によります。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-19 14:08
引用:

siopさんの書き込み (2005-11-19 07:51) より:

小数点はdoubleを使えばいいや〜って思ってたのですが、間違いですね。

OUTPUTを人間が見るものの場合、doubleは使えないってことかな。


だから、どれくらいの精度が必要かによるんです。精度=桁数。

 お金を扱うのなら、decimal を使います。これは10進数のまま、計算されます。先に COBOLer 以外と書いたのは、COBOL はお金を扱うために、10進数で計算するからです。

 しかし、科学計算などになると、そのような精度は必要なくなってきます。地球と太陽の距離を求めるのに、1mm に、どんな意味がありますか?せいぜい、上位10桁ほどの値が保証されていれば、あとは誤差です。99.999 も、適当な桁で四捨五入すると、100.0 になりますよね。そういう使い方をします。
未記入
大ベテラン
会議室デビュー日: 2005/03/12
投稿数: 148
投稿日時: 2005-11-19 14:43
何か思い込みしているみたい。
Decimalって人間が見る場合に限定するとそんなに完璧なものなのか。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-11-19 15:41
何か勘違いしていない?

引用:

siopさんの書き込み (2005-11-19 07:51) より:
モヤモヤ、晴れてきました。
A=B/K=490/4.9=99.99999999999
・元に戻らない!


工学計算では常に有効桁数を考慮します。表示するときには有効桁数2桁で四捨五入すれば戻ります。元に戻るか否かが問題なのでは無いんですよ。

コード:
double a = 1.0;
double b = 3.0;
double c = (a / b) * b;


上の計算結果は3です。

コード:
decimal a = 1.0;
decimal b = 3.0;
decimal c = (a / b) * b;


こちらの計算結果は0.9999999999999999999999999999です。

Decimalで計算したから元に戻ったり、人手で計算した結果と同じになるとは限りません。理由は分かりますよね。1/3は無限小数となって10進数ではあらわせないからです。でも2進数なら有限の小数として表現できます。

DecimalとDoubleの差は、10進数で数値を表現して演算を行うか、2進数で数値を表現して演算を行うかだけです。じゃ、なんで財務計算ではDecimalを使うのか。財務計算では表現されている数値は全て有効桁として扱う必要があり、10進数<->2進数の変換に伴って発生する誤差を許容できないからですよ。
jk
ベテラン
会議室デビュー日: 2005/08/19
投稿数: 94
投稿日時: 2005-11-19 21:29
引用:

甕星さんの書き込み (2005-11-19 15:41) より:

1/3は無限小数となって10進数ではあらわせないからです。でも2進数なら有限の小数として表現できます。



?10進で無限小数なら2進でも無限小数じゃないですか?

1/3進数とかならあらわせるとおもいますが整数進数じゃ無理じゃないですか?
未記入
大ベテラン
会議室デビュー日: 2005/03/12
投稿数: 148
投稿日時: 2005-11-19 22:13
<雑談>
3進数なら小数点以下第一位つまり0.1は、10進数の1/3と同じじゃないの。
jk
ベテラン
会議室デビュー日: 2005/08/19
投稿数: 94
投稿日時: 2005-11-19 23:07
引用:

未記入さんの書き込み (2005-11-19 22:13) より:
<雑談>
3進数なら小数点以下第一位つまり0.1は、10進数の1/3と同じじゃないの。


そうでつね^^;

<いいわけ>
熱があってぼーっとしてますた。
</いいわけ>
さいくろう
大ベテラン
会議室デビュー日: 2005/11/19
投稿数: 170
お住まい・勤務地: 川崎市
投稿日時: 2005-11-19 23:15
引用:

未記入さんの書き込み (2005-11-19 14:43) より:
何か思い込みしているみたい。
Decimalって人間が見る場合に限定するとそんなに完璧なものなのか。


10進数がこの世の真理で、2進数はオマケ、くらいに考えてるんじゃないかな。
2進数は2進数の振る舞いをするのであって、10進数の振る舞いを
完璧にトレースするのは、そりゃ無理でしょ。

>siopさん
他の方も指摘しているけど、4.9でも0.1でも、何でもいいから、
10進数表現の少数を、2進数表現に、自分で変換してごらんなさい。

[ メッセージ編集済み 編集者: さいくろう 編集日時 2005-11-19 23:20 ]

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