| 2019/05/18(Sat) 00:30:20 編集(投稿者) 2019/05/16(Thu) 14:55:11 編集(投稿者) 2019/05/16(Thu) 12:41:37 編集(投稿者) 2019/05/16(Thu) 12:38:59 編集(投稿者) 2019/05/16(Thu) 12:31:13 編集(投稿者) 2019/05/16(Thu) 12:10:48 編集(投稿者)
> エクセルで計算結果が「0」にならないのが発生しています > なぜでしょう
浮動小数点(フローティング・実数)の演算では、原理上誤差が生じます。
これは、少数を含む四則演算を行った場合と、除算によって演算結果に少数が含まれていた場合、の両方のケースで発生すると思いますよ。
試しに「エクセル 浮動小数点」でググってみてください。
なお、桐の場合には、実数型がこれに相当します。
ちなみに、桐の数値型や通貨型は、二進化十進数 (BCD、Binary-coded decimal )で演算していますのでこの問題は発生しませんよ。 ご安心ください。
<追記>
> いまネットで調べましたら、マイクロソフトのサポートページに >>0.1、0.2、0.3、0.4、0.7、0.8が誤差を発生します。
DOSの頃の dBASE でも、いとも簡単な丸め(四捨五入)処理で誤差が出ますよ。 演算結果に有効桁数以下のごく小さな値を加算して補正する方法が有効でした。
桐の数値型・通貨型は二進化十進数 (BCD、Binary-coded decimal )で演算していますので心配はいりません。
なお、桐の実数型は、ODBCで接続するためのものですよ。
<さらに追記>
■サンプルプロシージャ
手続き定義開始 cmdTestClick( ) 変数宣言 自動,実数{ &numFloat } 変数宣言 自動,数値{ &numBcd }
&numFloat = 1100.475 トレース出力 _&numFloat トレース出力 _#四捨五入( &numFloat, 2 ) , " 1100.48 にならずに桁落ちする" トレース出力 _#四捨五入( &numFloat + 0.00001, 2 ), " 有効桁以下の値(ここでは、0.00001)を加算して補正する"
&numBcd = 1100.475 トレース出力 _&numBcd トレース出力 _#四捨五入( &numBcd, 2 )
手続き定義終了
<トレース結果>
:&numFloat : 1100.475 :#四捨五入( &numFloat, 2 ) : 1100.47 1100.48 にならずに桁落ちする :#四捨五入( &numFloat + 0.00001, 2 ) : 1100.48 有効桁以下の値(ここでは、0.00001)を加算して補正する :&numBcd : 1100.475 :#四捨五入( &numBcd, 2 ) : 1100.48
|