我有一个特殊的应用程序,需要计算非常具体的东西,虽然我擅长逻辑,但数学一直是我的弱点。
给定一个数字,比方说-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美元,.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;
}虽然这个公式有效,但我对条件+/-不是很满意,但这基本上是唯一对我有效的公式。
有没有人能提出一个改进的方法呢?最好不带+/-?
编辑:
当我问这个问题时,我知道一个可能的答案是“这可能是你正在做的最好的方式”,这似乎是共识。
发布于 2009-09-05 06:43:58
处理这一问题的一种明智的方法是在内部使用从正到负的普通数字进行计算,并且只加/减100来表示。
发布于 2009-09-05 10:28:35
我强烈怀疑您的示例函数已损坏。是复印粘贴的,还是你重新打的?
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;
}这非常简单,而且不容易优化
你可以做一些基于符号的技巧来避免其他人建议的测试,但结果将非常混乱,可能会更慢。
我的建议是让它保持原样。
发布于 2009-09-05 06:36:45
优化通常是为了让某些东西运行得更快。你是否真的发现你的代码运行得不够快?我想不会。
如果您的代码生成了正确的结果,并且以一种不需要花费大量时间的方式完成,那么就不要管它,专注于其他实际的代码,而不是感知到的问题。
如果你只是担心它的外观,添加一些注释来解释它是如何工作的。您很可能无论如何都必须使用一个公式解决方案来执行此操作,因此您可能不会浪费您的精力。
https://stackoverflow.com/questions/1382620
复制相似问题