「バンカーズアルゴリズム」の秘密が明らかに!フロントエンド テーブルでカスタム数式を使用して「偶数に丸める」

「バンカーズアルゴリズム」の秘密が明らかに!フロントエンド テーブルでカスタム数式を使用して「偶数に丸める」

銀行の収益モデルとは何でしょうか? 3 つの言葉: 情報の非対称性です。銀行は預金者から資金を集めて貸し出し、その金利差がいわゆる「利益」となります。

私の国では、中国人民銀行は、各四半期末の20日を銀行の利息決済日と定めており、利息は年に4回決済されます。そのため、預金者に支払われる利息は、毎年非常に頻繁に計算する必要があります。利息を計算する場合、小数点の扱い方が重要になり、利益額を決定する上で重要な詳細になります。

一般的に、小数点以下の桁数を残す場合は四捨五入がよく使用されることは誰もが知っています。 5未満の数字は切り上げられて切り捨てられ、5以上の数字は切り上げられて切り捨てられます。すべての位置の数字は自然に計算されるため、確率計算によれば、切り上げられた数字は0から9の間で均等に分布します。

10 回の預金利息の計算をモデルとして、銀行員の視点からこのアルゴリズムについて考えてみましょう。

破棄された値には、0.000、0.001、0.002、0.003、0.004 が含まれます。銀行にとっては、破棄された内容は支払う必要がなくなるため、破棄された部分を「利益」として理解できます。

丸められた数字には、0.005、0.006、0.007、0.008、0.009 が含まれます。銀行にとって、丸められた数字は損失を引き起こし、対応する損失額は、0.005、0.004、0.003、0.002、0.001 です。

切り捨てられて丸められる数字は 0 から 9 の間で均等に分散されるため、10 回の預金ごとに丸めることで銀行側が得る利益は次のようになります。

0.000 + 0.001 + 0.002 + 0.003 + 0.004 - 0.005 - 0.004 - 0.003 - 0.002 - 0.001 = -0.005

一般的に言えば、10 回の取引ごとに端数処理により 0.005 元の損失が発生します。つまり、利息計算ごとに 0.0005 元の損失が発生します。ある銀行に 5,000 万人の預金者がいると仮定します。単純に四捨五入の誤差によって毎年失われる金額は次のようになります。

 パブリッククラスクライアント{
パブリック静的void メイン文字列[] 引数){
//銀行口座数5000万
int アカウント番号= 5000 * 10000 ;
//中国人民銀行の規定によれば、各四半期の最終月の20日は銀行の利息支払日である。
ダブルコスト= 0.0005 * accountNum * 4 ;
System . out . println ( "銀行が毎年失う金額: " + cost );
}
}

計算結果は、「銀行が毎年失う金額:100000.0」となります。ちょっとした端数処理が毎年10万元の損失につながるとは信じられないかもしれません。しかし、現実世界の環境では、実際の損失ははるかに大きくなる可能性があります。

この状況は米国のプライベートバンカーによって発見され、この問題を解決するための修正アルゴリズムが提案されました。

「捨てられた数字の値が 5 未満の場合、そのまま捨てられます。

破棄された数字の値が 6 以上の場合、繰り上がり後に破棄されます。

破棄された数字の値が 5 に等しい場合、次の 2 つのケースがあります。5 の後に他の数字がある場合 (0 ではない)、その数字は繰り上がり、破棄されます。5 の後に 0 が続く場合 (つまり、5 が最後の数字である場合)、5 の前の数字のパリティを使用して、その数字を繰り上がるかどうかが決定されます。奇数は繰り上がり、偶数は破棄されます。 ”

上記のすべてを 1 つの文にまとめると、最も近い 5 に切り上げ、5 の後の数が 0 でない場合は 1 を加え、5 の後の数が 0 の場合はその数が奇数か偶数かを検討します。5 の前の数が偶数の場合はそれを破棄し、5 の前の数が奇数の場合は 1 を加えます。

例として、2 桁の精度を使用します。

10.5551 = 10.56

10.555 = 10.56

10.545 = 10.54

(インターネットからの写真)

簡単に言えば、「最も近い偶数に切り上げる」という銀行家のアルゴリズムにより、データをより科学的かつ正確に処理することができます。

実際のアプリケーションでは、大量のデータを含む表計算でバンカーアルゴリズムが最もよく使用されますが、表計算では一連の組み込み式による複利計算が必要になります。一般ユーザーにとっては、理解するのも使用するのも面倒で複雑です。

この問題をより便利に解決するために、このような要件を満たすカスタム関数を使用できます。これにより、ユーザーはカスタム関数名を覚えておくだけで、このようなルールで関数を使用できるようになります。

次に、フロントエンドテーブルで「最も近い偶数に丸める」を素早く実装する方法を見てみましょう。

まず、関数の名前と、関数が受け取るパラメータの数を定義する必要があります。私たちが実現したいのは 2 つのパラメータを渡すことです。「1」は丸める必要がある値、「2」は保持する小数点以下の桁数であり、値と桁数に基づいて丸めが実行されます。

 var FdaFunction = 関数(){
this .name = "FDA" ;
this.minArgs = 1 ;
this.maxArgs = 2 ;
};

次に、ユーザーの理解と使用を容易にするために、このカスタム関数に説明を追加する必要があります。

 FdaFunction.prototype.description = 関数( ) {
戻る{
説明: 「指定された小数点以下の桁数を保持したまま、値を最も近い整数に丸めます」
パラメータ: [{
名前: "値"
繰り返し可能: false
オプション: false
}, {
名前: 「場所」
繰り返し可能: false
オプション: false
}]
}
}

最後に、重要なステップ、つまり関数の論理演算をevaluateに配置します。渡された値に対して何らかの判断を行い、正規表現を使用していくつかの一致を作成します。 「5 in double」を達成するには、繰り上がるかどうかを決定するために切り捨てる必要がある最後の桁の値も判断する必要があります。詳細については、添付の完全なデモを参照してください。

 FdaFunction.prototype.evaluate = function ( context , num , places ) {

if ( ! isNaN ( parseInt ( 数値)) && ! isNaN ( parseInt ( 場所))) {
コンソール.log ( "評価" )
num = numGeneral ( num );
if ( ! isNumber ( num )) {
数値を返します
}
var d = 場所|| 0 ;
var m = Math.pow ( 10 , d ) ;
var n = + ( d ? num * m : num ) .toFixed ( 8 ); // 丸め誤差を避ける
var i = Math.floor ( n )
f = n - i ;
var e = 1e-8 ; // f の丸め誤差を考慮する
var r = f > 0.5 - e && f < 0.5 + e ? ( i % 2 == 0 ? i : i + 1 ): Math . round ( n );
var 結果= d ? r / m : r ;

if ( 場所> 0 ) {
var s_x = 結果.toString ();
var pos_decimal = s_x . indexOf ( "." );
pos_decimal < 0場合
pos_decimal = s_x . 長さ;
s_x + = "." ;
}
while ( s_x . length <= pos_decimal + places ) {
s_x + = "0" ;
}
s_x を返します
} それ以外{
結果を返します
}
} それ以外{
"#VALUE!" を返します
}

}

完全なデモをダウンロード:

https://gcdn.grapecity.com.cn...​​

カスタム数式について詳しく知りたい場合は、次のリンクを確認してください。

https://demo.grapecity.com.cn...​​

<<:  2022 年に予測されるロボット技術のトレンド トップ 10

>>:  機械学習で人気のアルゴリズムトップ10

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

詳細なチュートリアル: Web スクレイピングにプロキシ サーバーを使用する方法

ワールドワイドウェブはデータの宝庫です。ビッグデータの容易な利用可能性、データ分析ソフトウェアの急速...

eMule プロトコルの DHT アルゴリズム

BT プロトコルと eMule プロトコルのアルゴリズムにはいくつかの違いがあり、この 2 つを併用...

...

JetBrains が 2023 年開発者レポートをリリースしました。 35年来の危機は存在するのか?最高のプログラミング言語はどれですか?

開発者の間で大きな影響力を持つ JetBrains が、毎年恒例の「開発者エコシステムの現状」レポー...

初心者と専門家のための機械学習に関するベスト 10 書籍

機械学習を学びたいですか? まずはこの 10 冊の本から始めましょう。 [[374789]] >...

わずか60行のコードでディープニューラルネットワークを実装する

01データセットの準備使用されるデータセットは、30 次元の特徴と 569 個のサンプルを含む、sk...

TensorFlow について知っておくべき 9 つのこと

[[241153]]キャシー・コジルコフマシンハートが編集参加者: Gao Xuan、Lu Goog...

大規模機械学習のためのプログラミング手法、計算モデル、Xgboost および MXNet の事例

[[191977]]現在、機械学習のトレンドは、従来の方法のシンプルなモデル + 少量データ (手動...

ピュー研究所の報告:2025年までにAIのせいで7500万人が解雇される

[[253650]]テクノロジー専門家の約 37% は、人工知能 (AI) と関連技術の進歩により、...

たった2枚の写真でAIは完全なモーションプロセスを生成できる

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

人工知能と5G: 新たなデータの世界へ

調査によると、AI デバイスのベンダー中心の展開モデルでは、トラフィックの急激な増加に対応できないこ...

初心者の機械学習エンジニアが犯しがちな6つの間違い

機械学習では、製品やソリューションを構築する方法が多数あり、それぞれが異なることを前提としています。...

...

...

畳み込みニューラルネットワークは「グラフ」構造化データを処理できないのですか?この記事でその答えが分かります

この記事で紹介する論文は、ICML2016でのグラフへのCNNの応用に関する論文です。 ICML は...