丸め誤差の処理方法<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />簡単な計算を行い、結果をウィンドウに表示する次のスクリプトがあります。
小計 = 100.05 ;
割引率 = 0.1 ;
割引額 = 小計 * 割引率;
totalBeforeTax = 小計 - 割引額;
フォーマットされたメッセージ =連結(
"小計:" 、繰り返す( " " 、 5 )、フォーマット(小計、 "通貨" )、 「\!n」 、
「割引率:」 、繰り返す( " " 、 5 )、フォーマット(割引率、 "パーセント" )、 「\!n」 、
"割引額:" 、繰り返す( " " 、 5 )、フォーマット(割引額、 "通貨" )、 「\!n」 、
「税引前合計:」 、繰り返す( " " 、 5 )、フォーマット(税前合計、 "通貨" )、 「\!n」
);
フォーマットされたメッセージ表示 =新しい窓( "結果" 、
ラインナップボックス( N コル( 1 )、間隔( 0 、 0 )、ボーダーボックス(左( 20 )、右( 20 )、 上( 20 )、 下( 20 )、
テキストボックス(フォーマットされたメッセージ、<< SetFontSize ( 14 ) ) )
)、
見せる(小計、discountAmount、totalBeforeTax)
);
ログと出力ウィンドウに次のように表示されます。



だから使ってフォーマット(税前合計、 "通貨" )、結果in totalBeforeTax は「切り上げ」です。 これを処理するさまざまな方法を考えることができますが、何が最も推奨されるのか疑問に思いました.
Re: 丸め誤差の扱い方現時点では Big Number の計画はありません。StackOverflow リンクには、興味深い点がたくさんありました。数値をどうするかによって、適切なソリューションが異なる場合があります。
クレイジ
Re: 丸め誤差の扱い方私が考えたもう 1 つのことは、文字列に変換して正規表現を使用することでした。
Re: 丸め誤差の扱い方Craige に感謝します。実際、JMP が Java の BigDecimal クラスにアクセスできるようにするためのインターフェイスを構築することを検討していました。 これをJMPの次のバージョンにタイプとして含める予定はありますか?
Re: 丸め誤差の扱い方discountAmount の計算を四捨五入/下限/上限にしたい場合があります。Round には 2 番目の引数があり、小数点以下の桁数を 2 に設定できます。同様の結果を得るには、床と天井に floor(x*100)/100 のようなものが必要です。
小計 = 100.05;
割引率 = 0.1;
割引金額 =ラウンド(小計 * 割引率、 2) ;
totalBeforeTax = 小計 - 割引額;
表示 (割引額、税前合計);
割引額 = 10.01;
totalBeforeTax = 90.04;
元のコードの format 関数は、切り上げまたは切り下げのナイフエッジにあり、0.005 は 2 桁に丸められます。プレゼンテーションの不一致は、マイナスの値とプラスの値を持つ値によって引き起こされます...両方の値が切り上げられますが、計算ではいずれかの値が負の discountAmount になります。
JMP で使用される浮動小数点数は、0.01 のような数を切り捨てられた繰り返し 2 進小数として表します。1/3 が正確に 0.333333333333 ではないのと同様に、内部表現も正確ではありません (1/2、1/4、1/8 などの 2 進数の分数を除く)。 0.01 として表される 100 ペニーを合計すると、1.00 に非常に近い数値が得られますが、小数点以下 16 番目が異なります。この非常に小さなエラーにより、会計パッケージは常に別の表現を選択するようになりました。 java - 通貨を表すために Double または Float を使用しないのはなぜですか? - スタックオーバーフロー
合計 = 0;
For( i = 1, i <= 100, i++, 合計 += .01 );
show( format(合計,"固定",20,16) );
Format(合計, "固定", 20, 16) = "1.0000000000000007";
Re: 丸め誤差の扱い方こんにちはジム、
返信ありがとうございます。 したがって、Floor と Ceiling は最も近い整数に丸められます。 形式 (x, "Currency") は、基本的に Round(x,2) を使用しているように見えます。 「通貨」形式では、丸めではなく切り捨て方法が採用されると思われるかもしれません。
Re: 丸め誤差の扱い方私は多くの財務報告を行うわけではありませんが、丸め誤差を心配する必要がある場合は、Round()、Ceiling()、Floor() 関数を使用するだけです。