- ベストアンサー
端数処理の問題:0.999...(無限)と1の関係について
- 0.999...(無限)と1は数値として完全に一緒ですか?
- 公共工事における前金払いの端数処理について質問です。
- 発注者が行っている端数処理の方法に疑問を持ちました。
- みんなの回答 (13)
- 専門家の回答
質問者が選んだベストアンサー
1)行政のルールは、知りませんが、数学的には貴方が正しいです。 2)行政のルールに計算順序まで書いてあれば別ですが 総前払金額を年度比率で按分するのであれば、この順番に式を作り 126百万円x105百万円÷315百万円 でも良いわけで、この順番で計算すれば4200万円になります。 3)年度比率で按分とは、比率ですから、行政ルールでは按分数値を整数にしろとは書いてないと思いますので分数のままでよいと思います。 105百万円÷315百万円=1/3 126百万円x1/3=4200万円 1万円未満を切り捨は、最後の答えにのみ適用と考えます。 私なら、行政官にクレームをつけます。 4)前払い金額が行政官のいう通りとしても、残金は(請負金額ー前払い金)なわけですから、 最終全額もらえるので、現実問題としては、どちらでも良いようにも思います。
その他の回答 (12)
- stomachman
- ベストアンサー率57% (1014/1775)
> 平成25年度分は「(105百万円÷315百万円)×126百万円 ご質問の間違いでしょう。計算式はもしかして、 (105百万円÷315日)×126日 ですかね。 でも、小学校だか中学校だかで習った通り、掛け算と割り算は順番を変えても良いのですから、 (105百万円÷315日)×126日 = (105[百万円]×126[日])÷315[日] = 13230[百万円・日] ÷315[日] = 42[百万円] である。端数なんか元々出やしません。 ところが、コッパ公務員は割り算をまずやって、(105百万円÷315日)を計算した。いったん「1日当たりの工事価格」を出した訳です。これはまだ計算の途中である。なのにこの段階で切り捨てをやって、それから工事日数を掛け算をした。だから答が合わない。 こういう風に、金額を細切れにしておいて、端数を切り捨ててから積み上げる、というのが「お役所の<節約>法」の常套手段のようです。 そんな計算が許されるのなら、 1日=86400[秒] ですから、「1秒あたりの工事価格」を計算すれば 105[百万円]÷(315×86400[秒]) = 3.858…[円/秒] である。ここで1円未満の切り捨てをやると、1秒あたりの工事価格は3[円/秒]であるから、 3[円/秒]×(126×86400[秒]) 3[円/秒]×(10886400[秒]) = 32659200円 となり、もっと安くなる。 一体、なぜ切り捨てをするのか。コッパ公務員は「0.8円などという金額はない。だから切り捨てるのだ」と説明します。この点について、どのコッパ公務員も同じことを言うように思います。きっと、そう教育されているんでしょう。 いっそのこと「1ミリ秒あたりの工事価格」を計算すれば、0.003858…[円/ミリ秒]だから(1ミリ秒=1秒の千分の一)、切り捨てて0円。こうすれば、全く1円も払わなくて済んでしまいます。ばかばかしいですねえ。 さて、「掛け算と割り算は順番を変えても良い」というのは、割り算を先にして (105[百万円]÷315[日])×126日 [日] = (1/3)[百万円/日]×126[日] = 0.333…[百万円/日]×126[日] = 0.333…[百万円/日]×3÷3×126[日] = (0.333…×3)[百万円/日]×(126[日]÷3) = 0.999…[百万円/日]×42[日] = 1 [百万円/日]×42[日] = 42[百万円] と計算しても同じである、ということであり、つまり 0.999… = 1 である。これが数学の話です。
- masa2211
- ベストアンサー率43% (178/411)
発注者の説明がどこか変です。 請負金額の年度比率に按分なのだから、まず年度比率を計算。 そうすると、33.33%になります。 ※国交省積算基準に準拠すると仮定すると、比率を%表示した場合は小数2位まで、(四捨五入丸め。) 上記の丸めルールは、直工費から間接費を求めるときの率の丸め基準であり、年度またぎについてではない のですが、このルールを準用することを仮定します。 よって、比率計算のところに丸めが入るため、4199.58万円となり、無限小数にはならないし、 比率を1桁丸め(=33.3%)がルールなら、4195万円。 なお、この現象は、コンピュータで銭勘定する場合、大抵発生します。 数値に有理数型を用いている場合は、1/3などが正確に表せるから、この問題は発生しませんが 有理数型を装備しているプログラム言語はレア。(装備している例:フリーソフトの十進BASIC.) 銭勘定向きのCOBOLの場合、変数ごとに桁数を宣言する(たとえば、整数15位+小数2位)ので、 1/3は、たとえば33.33%として計算します。役所の計算どおりです。(桁数が一致しているかは別として。) 技術計算向きのFORTRANの場合、浮動小数点だから、有効桁+指数桁、たとえば有効15桁、指数は308まで。(倍精度実数。) 厳密には、内部は2進数なので、0.1などは循環小数となるので誤差ありです。 EXCELなども浮動小数点形式(桁は上で書いた通り)なので、こういった誤差があります。 ですから、0.0001を1万回足して1を引いてもゼロにはなりません。 昔の大型コンピュータ(IBM360)は更に悲惨で、 内部は16進で0.XXXXXX×16^yタイプ。現状の主流より最大最小の幅は大きいが精度が悪い。 しかも、 X=0.1 (計算式内に数値記述) data/X/0.1 (初期値としてデータを定義) read(*.*)X (キーボードやパンチカードからデータを読み取り) で、メモリーに保持される値が同じとは限らない(同じコンピュータ、同じコンパイラを使用、という条件で。) という、今ならトンデモ仕様。 よって、理論計算なら1.0になるところ、0.999...1(最後の桁1~2桁はアヤフヤ。) となるので整数切捨て丸めを行ったら1でなくゼロになる、という事態に悩まされます。 で、古いプログラム本には、 ・上記のように記述方法が異なる場合、数値が一致する保証は無い。 ・0.0001を1万回足して1を引いてもゼロにはならない。 ・そういうことを想定してプログラムせよ。 と、こうなっています。 (共立出版 プログラム書法。) 丸めがうっとおしい場合は、有理数モードとか超多倍長モード(たとえば10進1000桁)という方法も無いではないです。 (前述十進BASICは、有理数モードと10進1000桁を持っている。) でも、それでも、ケタが多いけれど無限桁ではないため、結局は計算途中で結果丸めが必要。 つまり、数学どおりに計算したくてもそうする方法が無い(勿論、ソロバンでも筆算でもダメ。) ということになるので、計算機のルールで計算するか、計算機ルールをすこしいじって手計算ルールで計算する (計算機的には、計算誤差をわざと混入させる意味になる)か、いずれか。 いずれにせよ、無限小数は取り扱い不能で、数値の丸めかたのルールを設定する必要があります。 数値の丸めかたのルールを設定した時点で、数学がどうのこうの、言っても意味がなくなります。
- alwen25
- ベストアンサー率21% (272/1253)
>0.999…(無限)と1は数値としては完全に一緒ですよね。では、(1÷3)×3の答えの小数点第2位以下を切り捨てたら、それは0.9なのでしょうか?それとも1.0、つまり1なのでしょうか? 私も行政の話は分からないので数学の話を書きます。 0.9999..=1の証明方法は、色々あると思いますが 私が高校で習ったものは無限級数を使う方法です。 等比数列の無限級数の公式に 0.9+0.09+0.009+0.0009+...(無限) を当てはめると厳密に1になります。 厳密に1(整数)の小数点第二位を四捨五入しても1になります。 1.0と書くと数学ではなく物理学や化学の有効数字を表しているように見えます。
- 中村 拓男(@tknakamuri)
- ベストアンサー率35% (674/1896)
数学だと可能無限、実無限論争とかがあって難しい話に なるそうですが、質問の問題は有限桁の数値計算の計算誤差問題ですよね。 前金なら半端な金額でも問題ないだろうし、四捨五入でも よいと思います。 有理数計算機を作って割り算を遅延させるという手も 有りますが、最終的な計算結果が端数を持つ場合は あまり意味が無いと思います(^^;
- Water_5
- ベストアンサー率17% (56/314)
1.0=0.99999...... は数学上の話です。それを日常生活の前金払い制度に 当てはめようとすることが、そもそも無理です。誤りです。 数学上の事と日常生活上の事は次元が違うので、かみ合いません。 ”π”なども数学上は数兆桁ですが、土木建築業界では π=3.14でがんがん計算します。ビルを造り、橋を作ります。こんな具合です。
- uyama33
- ベストアンサー率30% (137/450)
平成25年度分は「(105百万円÷315百万円)×126百万円=41,999,999.999…(無限)円」なので、1万円未満を切り捨てて「4,199万円」であると 平成25年度分は「 126百万円*(105百万円÷315百万円)= (126百万円*105百万円)÷315百万円= 4200 万円 のように計算してくれ と交渉してはいかがでしょうか? あとは、計算規則の書いてある文書を見せてもらって、コピーして 公開する。 後半は、お仕事の関係で難しいかも?
- ken-nosuke
- ベストアンサー率36% (56/154)
A.5 の追加です 最初の質問に答えるのを忘れていましたが、回答を書いている間に他の皆さんが応えてしまったので前払いについての追加です。 確認ですが、行政ルールでは、計算途中で数字を丸めろとは、言っていないですよね。 41,999,999・・(無限)は、数学では、42,000,000です。最後に円をつけて金額にしてから端数処理をするので、計算途中は、厳密に数学どおりに計算しなければいけません。 41,999,999・・(無限)が42,000,000より小さいと言う、行政官は、無知の横暴としか言い様がありません。
- alice_44
- ベストアンサー率44% (2109/4759)
「行政のルール」は分からないので、数学の話をします。 端数処理は、割り算に対して定義されるのではなく、 割り算の商を表す小数に対して定義されるものです。 小数とは、数値そのものではなく、 数値を表記する方法に過ぎません。 1÷3×3 の答えを小数第2位で切り捨てるという 言い方自体が、意味不明というか、定義不良で、 正しくは、1÷3×3 の答えを表す小数 1.000… を 小数第2位で切り捨てて 1.0 とするか、 1÷3×3 の答えを表す小数 0.9999… を 小数第2位で切り捨てて 0.9 とするか しなければならないのです。 無限小数なら、ひとつの数に対してひとつの表記 しかありませんから、混乱は起こりませんが、 有限小数は、末尾が 0 の循環になる小数と 末尾が 9 の循環になる小数のふたつの表記を持つため、 「数値を切り捨て」では、意味が定まらないのです。 そもそも、こんな混乱が起こった根本の原因は、 1 と 0.999… が「完全に一致」という 大雑把過ぎる理解にあります。 小数 1.000… と 0.999… は、同じ実数 1 を 表示していますから、数値としては完全に一致 していますが、見れば一目瞭然なように、 文字列としては異なります。 そして、「切り捨て」という操作は、 数値ではなく、文字列としての小数を対象とする ものなのです。
- stomachman
- ベストアンサー率57% (1014/1775)
幾ら正しい計算でも、途中で切り捨てなんてことをやれば、合計が合わなくなるのは当たり前。 計算方法を必要以上に複雑怪奇にして、部分の合計を計算しては切り捨てることを繰り返し、積み上げた結果が時々何万円とか何千円とか安くなるようにする。それで「国民の税金を節約したぞ!手柄だ」というのを「仕事」だと思ってる役人が居るんですよねえ。こういうヤカラの人件費をこそ、根こそぎ節約したい。 瑕疵もないのに契約金額の満額を払わないのはもちろん違法であり、民事訴訟を起こしてやりたいもんですが、相手は暇を持て余したコッパ公務員。大変だから誰もやらない。やらないからコッパも駆除できない。コバエみたいなもんですな。
- asuncion
- ベストアンサー率33% (2127/6289)
>間違いです。1と0.9・・・は同一ではないから小数点がある。 間違いじゃないんですよね。 質問者さんが書かれている建設業の話とは完全に離れてしまいますが、 数学的には0.999... = 1です。
- 1
- 2
お礼
みなさん、たくさんのご回答ありがとうございました。いずれも大変参考になりました。実際のところ「0.999…(無限に9)」と「1」が等しいことは、一般にはあまり普及していません。「数学教育の怠慢」といえば厳しい言い方になるかもしれませんが、日常生活や行政手続などにおいて、意外と影響がある場面もあるのです。今回は「公共工事の前金払」という特殊な事例でしたが、別の事例もありますので、別質問でお付き合いいただけたらと思います。みなさん、本当にありがとうございました。