過去の桐井戸端BBS (桐ver.8)
16331 一括処理で変数を使って四捨五入をしたいのに切り捨てになってしまう。(実数と数値の違い) YATA 2002/06/17-18:22
実は、一括処理で四捨五入をさせたいのですが、
切捨てのような動きになってしまいます。
設定その他で問題があるのでしょうか?

-----問題の個所はこのように使用しています-----

変数宣言 固有,実数{&ERR[6]}
変数宣言 固有,文字列{&ER[6]}
変数宣言 固有,数値{&回数}

繰り返し &回数=1,6
&ER[&回数]=#文字列 (#四捨五入((&ERR[&回数]),1))
繰り返し終了

&ERR[1]〜[6]には、実数で1.25、1.4、0.35、・・・等と入っています

仮に&ER[&回数]=#文字列 (#四捨五入(1.25,1))とすると

当然ながら&ER[&回数]=1.3になりますが

オリジナルの場合は&ER[&回数]=1.2になってしまいます
ちなみに四捨五入の部分・・・[&回数),2))としてやると
&ER[&回数]=1.25になるので変数の時点で1.2になっていることが無いのは確認しています。
どうしてこうなるのかどうしてもわかりません。
どなたか教えて頂けないでしょうか。よろしくお願いいたします。

16333 Re:変数を用いて四捨五入は出来ないのでしょうか T.Samura 2002/06/17-20:36
記事番号16331へのコメント
YATAさん、こんばんは。

>変数宣言 固有,実数{&ERR[6]}
 ここを数値型にすれば予想通りになる筈です。

 実数での少数表示は近似値なのでパソコンでは
予想外の動作になることが良くあります。

16345 有難うございました。解決しました YATA 2002/06/19-08:40
記事番号16333へのコメント
T.samuraさん早速の回答有難うございます。
その個所を訂正することで出来ました
整数と数値は、使い分けが分かる気がするのですが、実数と数値を不透明な感覚のまま使用していました。
何分小数点が大きく出る計算結果を処理するので
「その数値を実際の状態で使いたい>ってことは<実の数>という響きが一番、
生々しい感じだったので使用した。
そんな安易な考えでした。
表編集のマニュアルなどを見返したのですが、さらっと見た感じでは見当たらなかったので、
正直その定義と実際の用途の違いは未だに不明確ですが・・・・(もう1度マニュアル見直します)
本当に有難うございました!!


16348 数値型と実数型 T.Samura 2002/06/19-10:27
記事番号16345へのコメント
 数値型と実数型の違いは突き詰めると少数をどういった方法でメモリに持つかということになるようです。
桐のマニュアルの説明では範囲や消費バイト数までで、2つの明確な違いは探せませんでした。

 おおざっぱに乱暴に説明すると実数型では0.1は正確にメモリに保持できないが
数値型なら正確に保持できるといえます。
つまり実数型では0.1*10≒1ですが数値型なら0.1*10=1になります。

 1.25は実数型の場合1.2499999...〜1.250000...1の範囲で保持されて必ずしも1.25と等しくありません。
 事務計算で使う桐の場合、少数でも正確な計算が必要なので
うろ覚えですが数値型では125という数字並びと小数点位置を保持して1.25と等しくしています。

 以下の一括を実行すると1.25にならない場合があります。
 変数宣言 固有,実数{&実数=1.25}
 変数宣言 固有,整数{&I}
 繰り返し &I=2,16
  確認 #CAT(#STR(&I),"→",#STR(#切り捨て(&実数,&I)))
 繰り返し終了

 他のプログラム言語では少数は実数型相当が多いので扱いには注意を要しますが、
桐では数値型を使っていれば少数でも特別意識しないで使えます。

16354 Re:数値型と実数型 ONnoji 2002/06/19-18:59
記事番号16348へのコメント
YATAさん、T.Samuraさん、こんにちは。

すでにT.Samuraさんのアドバイスで桁落ちの件は解決されたわけですが、ちょっとだけ…スイマセンです。m(__)m

桐のメニューバーの[ヘルプ]→[トピックの検索] で[トピックの検索]を表示して、
[目次]タブで[仕様]→[データ型]を参照すると次の説明が書いてあります。
*-------------------------*
ノート

カウンタ型が使用できるのは表だけです。
実数型は、おもに外部データベースとのデータ交換で使用します。
実数型の演算は、常に誤差が生じる可能性があるため、お金などの数値を扱うデータ型としては適しません。
日常、扱う数値を格納する項目は、数値型または通貨型を使用してください。
*-------------------------*

という具合でして、
Win桐で新しく導入された実数型は使わないほうがいいですね。
実数型を導入した理由は外部データベースとのデータ交換が目的のようです(たぶん)。

桐の数値型・通貨型は小数を扱ったときの桁落ちを心配する必要がないので素晴らしいです。(^^v
ですから、安心して数値型や通貨型を使っていいと思います。

他のアプリケーションでは桁落ちを補正する必要がないとも限りません。
そういう経験のあるの一人としては、桐はエライといいたいです。(^^ゞ


16357 数値型と実数型に関して 佐田 守弘 2002/06/19-22:26
記事番号16354へのコメント
皆様
数値型と実数型の違いについて補足させて頂きます。
概ねは、T.Samuraさん、ONnojiさんがコメントされている通りです。
もう少し詳しく言いますと、桐の実数型とはC言語の浮動小数点型の値に準拠した方法だそうです。
一方、桐の数値型とはBCD型のデータです。

●浮動小数点型
整数は、二進法で正確な値を記述できますが、小数は一般にそれが困難です。
そこで、[ある桁数の有効数字]×10のn乗の形で記述します。そしてある桁数は、
単精度、倍精度などといくつかの有効数字の精度があります。
この方法は、掛け算や割り算の演算には便利なのですが、誤差が伴います。
そして有名な話ですが、1÷3×3が1にならず0.99999になる様なごくわずかな
誤差が誤差が発生します。

●BCD (Binary Coded Decimal:二進化十進)
浮動小数点型では、避けられないごく僅かな誤差を避けるため、小数を小数の通りに扱う方法です。
小数の精度は得られますが、演算速度が遅くなる欠点があります。
桐は、財務関係のデータ処理にも使う事を前提にしているので、BCDで扱う
数値型を標準のデータ型としているとの事です。

さて、桐ver.6以降で実数型が登場した理由は、ONnojiさんが書かれている通り、
外部データベース機能の追加によって、AccessやVBなどが扱うデータベース
との互換機能のためです。
実数型はこの様な外部データベースとのデータ交換の時に一時的に用い、
桐に取り込んだ後は数値型に変換するのが良い様です。

佐田守弘(KS-00119)

戻る