1

我有一个特殊的应用程序需要计算一些非常具体的东西,虽然我擅长逻辑,但数学一直是我的弱点。

给定一个数字,比如 -20,它需要应用一个以 100 为底的计算(即,底是 100,而不是 0。不要与底 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.40 美元赢取 1.00 美元,另一方面风险 1.00 美元赢取 1.20 美元,0.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

处理此问题的一种明智方法是使用在零处从正到负的普通数字在内部进行计算,并且仅加/减 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

通常进行优化以使某些东西运行得更快。您是否真的发现您的代码运行速度不够快?我怀疑不是。

如果您的代码生成正确的结果并且以不花费大量时间的方式执行此操作,请不要理会它,并专注于其他实际问题而不是感知问题的代码。

如果您只是担心它的外观,请添加一些注释来解释它的工作原理。无论如何,您很可能必须使用单一公式解决方案来做到这一点,因此您最好不要浪费您的精力。

于 2009-09-05T06:36:45.393 回答
0

“标志”解决方案可能更优雅:

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 回答