1.丸め方法丸めは、非常に広く使用されている近似計算方法です。これには、算術丸め方法と銀行の丸め方法の2つのタイプが含まれます。 いわゆる算術丸め方法は、通常の意味での丸め方式です。ルールは、放棄されたビットの値が5以上の場合、ビットが撤回されている間にビットが撤回されます。 いわゆる銀行家の丸め方は、基本的に、6を5に丸め、ダブルを維持すると4つの丸めを丸くする方法です(6つを5つの奇数に均一に均一に均一にします)。ルールは次のとおりです。放棄されたビットの値が5未満の場合、放棄されたビットの値が6以上の場合、ビットが放棄されている間にビットが正面に戻ります。左のビットの値が5に等しい場合、前の数字の値が奇妙な場合、前の桁の値が削除されている間、ビットがドロップされます。直接。 要約すると、2つの丸め方法によって得られた結果は一貫していないため、それらを使用するときに実際のニーズに応じて区別する必要があります。それ以外の場合、いくつかの不可解な逸脱が発生します。 2。デルファイの丸い関数はよく知られています。ただし、銀行家の丸め方法の規則に従って丸め操作を実装しています。 Delphiで丸め機能を使用していることは常にラウンドを使用していますが、それを使用して得られた回答は、予想されるものとは異なることがわかりました。例:i:= round(11.5)結果:i = 12i:= round(10.5)結果:i = 10はい、私たちの期待に応じて、2番目の関数は11を返す必要がありますが、なぜこれが起こるのですか? xxx.5の場合、整数部は奇数であり、その後、丸められます。 Delphiのバグですか?このプロセッサは、いわゆるバンカーの丸め方法を使用します。つまり、中間値(5.5、6.5など)にラウンド関数を実装するときに、プロセッサは、丸めが数の奇数と偶数の性質に基づいているかどうかを決定します。 5.5ラウンドなどの小数点は6で、6.5ラウンドの結果も6です。これは偶数であるためです。ラウンド関数は実際に操作に銀行家アルゴリズムを使用しており、一般にこのアルゴリズムを使用するために統計的に使用されています。誰かがこのように解決し、非常に小さな値を10.5に追加し、そのようにして、精度に影響を与えませんが、これは常に症状を治療する方法ですが、そうではありません。根本的な原因。別の機能はインターネットで見つかりました:function Doround:int64; = default8087cw(roundupcw)を試してください。これは、CPUのフローティングポイントユニット(FPU)コントローラー制御ワードの値です。上記のプログラムのアイデアは非常に単純です。これは、最初に8087cwを節約し、次に補充するように設定して、偶数が倒されず、最終的に8087cwを復元するように設定します。実際、上記の関数はSET8087CWの実装が提供されているため、プログラムはDoround(value:Extended)を簡素化しますoldcw:= default8087cw(roundupcw)を試してください。 1つのソリューション。実際、ボーランドは私たちがそのような問題に遭遇するだろうと長い間考えていたので、FPUの丸めモードをカスタマイズする必要があると考えていたので、使用する既製の機能を提供しました。数学ユニットには、SetRoundMode関数があります。以下は、関数の丸い関数ですsetroundMode(rm); end; exper:i:= roundex(11.5)結果:i = 12i:= roundex(10.5)結果:i = 11布?例:i:= roundex(11.5、rmtruncate)結果:= 11i:= rundex(rmtruncate)結果:i = 10roundex関数は非常に面白いです!