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

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

銀行の収益モデルとは何でしょうか? 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

ブログ    
ブログ    

推薦する

ディープラーニング(CNN RNN Attention)を使用して大規模なテキスト分類問題を解決する - 概要と実践

[[188373]]著者は最近、深層学習を応用してタオバオ商品のカテゴリー予測問題を解決するプロジェ...

...

AIが世界中の産業に及ぼす影響

人工知能は、すでに私たちの世界を微妙かつ広範囲に変化させている、画期的な技術です。クラウド コンピュ...

Python プログラミングにおける 3 つの一般的なデータ構造とアルゴリズム

Python には、リスト、セット、辞書など、非常に便利な組み込みデータ構造が多数あります。ほとんど...

...

...

...

百度脳がAIの「先導役」を演じる 王海鋒:AI時代の社会の知能化を共同で推進

11月1日、Baidu Brainは2018年Baidu世界大会の初イベントとしてデビューしました。...

インテルCEOがNVIDIAを非難:CUDA技術は時代遅れであり、業界全体がそれを終わらせたいと考えている

数日前、Intelは生成AI用のAIチップGaudi3を含む一連の新しいCPUを発売しました。計画に...

遺伝的アルゴリズムに基づく高周波タグアンテナの最適設計

無線周波数識別技術は、無線、非接触の自動識別技術であり、近年開発された最先端の技術プロジェクトです。...

ソラ爆発的人気の裏側|世界のモデルとは何かを語ろう!

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

自動運転車がコーナーを「見通し」できるようにする

自動運転車がその名に恥じない性能を発揮するには、満たすべき要件が数多くありますが、環境の認識と理解が...

自動化された機械学習は AI 研究の次の主流となるでしょうか?データサイエンティストの意見

自動化された機械学習は、過去 1 年間で大きな関心を集めるトピックになりました。 KDnuggets...

私たちは本当にロボットの「カンブリア紀の進化」に近づいているのでしょうか?

ロボット工学の分野は驚異的なスピードで進歩しており、多くの専門家がこの急速な発展を生物学における「カ...

日本のメディアは、監視と保護に加えて感染症の予防にも役立つ鳥類識別AIの中国での推進に注目している。

日本のメディアZDNETは6月29日、中国が全国規模で鳥類識別AIの普及を推進しているとの記事を掲載...