1

私は非常に具体的な何かを計算する必要がある特定のアプリケーションを持っています、そして私は論理に優れていますが、数学は常に私の弱点でした。

数値、たとえば-20が与えられた場合、100ベースの計算を適用する必要があります(つまり、ベースは0ではなく100です。まったく別のベース100と混同しないでください)。

言い換えれば、数学は次のように機能します...、105、104、103、102、101、100、-101、-102、-103、-104、-105、...

次に、この100の基本数値に基づいて計算を行う必要があります。

したがって、たとえば:

-140 - 20 =  120
-120 - 20 =  100  
-115 - 20 = -105
-110 - 20 = -110
-105 - 20 = -115
 100 - 20 = -120  
 120 - 20 = -140

それが役立つ場合、問題はスポーツオッズに関連しています。理論的には、これはお金を指します(一方の側で$1.00を獲得するためのリスク$1.40、他方の側で$1.20を獲得するためのリスク$1.00、.20の違いは、カジノが「ジュース」と呼ぶもの、またはお金を前後に動かすカットです)。 、プログラムは実際のお金を扱っていません、それはシミュレーターのようなものです。

私の現在の式は次のように機能します。

decimal CalculateSides(decimal side, decimal vig)
{
    decimal newSide = side - vig;

    newSide = -(newSide < 0) ? newSide + 100 : newSide - 100;

    return (newSide < 0) ? newSide + 100 : newSide - 100;
}

この式は機能しますが、条件付き+/-にはあまり満足していませんが、基本的にこれが私にとって機能する唯一の式です。

誰かがこれを改善する方法を提案できますか?できれば+/-の条件なしで?

編集:

私が質問をしたとき、私は一つの可能​​な答えが「あなたがそれをしている方法がおそらく最善である」であると知っていました、そしてそれはコンセンサスのようです。

4

4 に答える 4

6

これを処理するための賢明な方法の1つは、ゼロで正から負に変化する通常の数値を使用して内部で計算し、表示のために100を加算/減算することです。

于 2009-09-05T06:43:57.907 に答える
2

サンプル関数が壊れているのではないかと強く思います。コピーペーストですか、それとも再入力しましたか?

decimal CalculateSides(decimal side, decimal vig)
{
    decimal newSide = side - vig;
    newSide = -(newSide < 0) ? newSide + 100 : newSide - 100;
    return (newSide < 0) ? newSide + 100 : newSide - 100;
}

CalculatesSides(115、20)を試してみると、-95が得られますが、希望どおりになる可能性は低くなります。(私はよく結果が-105であるべきだと理解しています)。

しかし、あなたが書き込もうとしていることは十分に明確に思えます。私はそれがすべきだと信じています:

decimal CalculateSides(decimal side, decimal vig)
{
    decimal newSide;
    side = (side < 0) ? side + 100 : side - 100;
    newSide = side - vig;
    return (newSide < 0) ? newSide - 100 : newSide + 100;
}

これは非常に簡単で、最適化するのは簡単ではありません

  1. モードを100baseから0baseに変更します
  2. ゼロベースで計算
  3. 結果ベースを0baseから100baseに変換します

他の提案のようにテストを回避するために兆候に基づいていくつかのトリックを行うことができますが、結果はかなり曖昧になり、おそらく遅くなります。

私のアドバイスはそれをそのままにしておくことです。

于 2009-09-05T10:28:35.330 に答える
1

最適化は通常、何かをより速く実行するために行われます。コードが十分に高速に実行されていないことに実際に気づきましたか?私はそうは思わない。

コードが正しい結果を生成し、それほど時間がかからないようにそれを行う場合は、それをそのままにして、認識された問題ではなく実際の問題である他のコードに集中します。

見た目が気になる場合は、コメントを追加して、どのように機能するかを説明してください。とにかく1つの式のソリューションでそれを行う必要がある可能性が高いので、労力を無駄にしないほうがよいでしょう。

于 2009-09-05T06:36:45.393 に答える
0

'sign'ソリューションはよりエレガントである可能性があります。

decimal CalculateSides(decimal side, decimal vig)
{
    decimal res = side - vig  +  (100 * Math.Sign(side));
    return  res               +  (100 * Math.Sign(res));
}

あなたのアルゴリズムはあなたの与えられた例には適用されないことに注意してください。

于 2009-10-15T22:50:39.927 に答える