Q11Qの記事が引用された奇妙な相談
Excel2016を利用しております。
電卓で計算すると
1117000÷12×6=558499.999999999...
という計算なのですが、Excelで計算すると答えが
1117000÷12×6
=558500.000....
になります。小数点以下が勝手に四捨五入されているようです。
表示形式をいじったりしましたが、そもそも計算結果の小数点以下が存在しないような感じです。
この違いだけでも大きくこの後の計算がかわってくるので困っています。
過去質問を検索しても表示形式の事ばかり出てくるので、***計算過程でかってに四捨五入されない方法がありましたら教えていただきたいです。 ***
BA Best Answer
>Excelで掛け算の計算が合わない
これは割り算が原因です・・・
÷12×6
は ×2
1117000÷2=558500
小数数点以下ない・・・
(中略)
しかし小数点以下のある数値では簡単式でも
違う結果になります
演算御座
https://eip.econ.kanagawa-u.ac.jp/eip/excel-calc-error.html
http://qiita.com/Q11Q/items/84b380b20ef51eca929call********さん 2017/5/212:48:12
参考に
EXCELの単純な計算に誤差があるようです。12.3-12=0.3000000000000010000となり0.3にならず困っています。もし、どのEXCELも同じ現象なら大きな問題です。
yuu********さん
2017/5/212:53:01
早速のご回答ありがとうございます
ご回答とリンク先を読ませていただきました。
大変わかりやすく、ほとんど初心者の私でも、理解でき、今求めている答えをExcelで導き出すことは難しいと納得することが出来ました。
おかげさまで無駄な時間を削減することができそうです。ありがとうございました。
BA以外
gru********さん(カテゴリマスター) 2017/5/212:27:11
12で割って6をかけるんだから、2で割ったのと同じになるのが正しいんです。電卓は最後まで確認して最適化せず途中の割り切れない部分をぶった切っているので、そういう間違った結果になります。Excelの勝ちですね。yuu********さん 2017/5/212:37:27
早速のご回答ありがとうございます。
確かにおっしゃる通りなのですが、どうしてもこの計算過程を通ったうえでこの計算結果を出さないといけない事情がございまして…。***
Excelの仕様ということですね。ありがとうございます。
だいぶ間違いすぎだろ
まず演算御座ってなんだよ
誤字がひどい
電卓のアルゴリズム
1117000÷12×6=558499.999999999...
これは右から÷12=a
a×6
と計算していくから
これは仕様であって勝ち負けではない
なんなのこのカテゴリマスター
しかし実はExcelで再現するのは難しい
コードの中では簡単だが
CDec (CDec(1117000 / 12) * 6)
電卓通りにするにはVBAを使う以外思いつかない
質問者の注文通りに結果を出すにはCDecで計算のステップごとに囲むのが有効
Debug.Print CDec (CDec(1117000 / 12) * 6)
結果をセルに入れると変換されてしまう
Sub test()
Range(ActiveCell.Address).value= CDec (CDec(1117000 / 12) * 6)
End Sub
クレーマー臭を感じる
一体これなんの意味がある質問なんだろう…まず、たいへんわかりやすいというのはウソだな。
表示形式をいじったりしましたが、そもそも計算結果の小数点以下が存在しないような感じです。
この違いだけでも大きくこの後の計算がかわってくるので困っています。
確かにこの値をそのまま入れても自動調整されてしまう。そら後ろが0になるのは当然だ。
しかしその程度の素人がなぜこんな電卓をExcelでシミュレートしようというのか。
クレーマーが電卓の誤差をあげつらうために計算式をExcelでまとめ、電卓会社へ突っ込むのではないか。
文字列にしてみる
Sub cdccalcStr()
'計算結果をActivecellに入れる
'ただし文字列になる
Dim R As Range
Set R = Range(ActiveCell.Address)
Dim buf As String
R.Value = "'" & CDec(CDec(1117000 / 12) * 6)
End Sub
演算誤差で得た知識を活用する
Excelの内部演算が15桁なら、その下の位で循環小数や無限小数を計算して調整するのではないか?
ならば して されないようにすればいいのでは?
Sub cdccalc()
Dim R As Range
D
buf = CStr(CDec(CDec(1117000 / 12) * 6))
L t( , )
R. =
End Sub
まとめ
まず計算法則を理解していない。理解していればExcelの方が正しい。また、無理に電卓の結果を通らなければいけない計算はない。
あまりにも不可解すぎるし、いやな予感がするので半分コードを示した。
際限なくただで要求をエスカレートする可能性が多いから。
この質問者のずれっぷりは薄気味悪いので、これ以上は書かない。
しかしこれ以上は10億円積まれない限り応じられない。