【发布时间】:2015-01-23 15:45:14
【问题描述】:
我正在处理一些继承的代码,并且我有一个函数可以转换为挥杆重量的格式(高尔夫球杆术语,适合非高尔夫球爱好者)。此函数将字母/浮点格式(例如 C3.1、E4.5 等)转换为十进制格式(例如 20.15)。这不是一种直观的转换,正如您将在下面执行转换的 switch 语句中看到的那样。我的问题是代码只有这种单向转换(从 C8.9 到 20.15),现在我需要反转它(从 20.15 到 C8.9),所以如果解决这个问题对任何人来说都比对我来说,我很想听听你的建议。如果这不是此类问题的正确位置,请告诉我,我会移动它。
// lorythmicSwingWeight will be in the Letter/Float format, e.g. D3.0
internal static decimal ioSW(string lorythmicSwingWeight)
{
string lSW_alpha = string.Empty;
decimal lSW_num = 0.0m;
decimal oSW = 0.0m;
//parse first letter
lSW_alpha = lorythmicSwingWeight.Trim().ToUpper().Substring(0, 1);
//try to parse number
decimal.TryParse(lorythmicSwingWeight.Substring(1), out lSW_num);
switch (lSW_alpha)
{
case "A":
if (lSW_num < 10)
oSW = (20000m * lSW_num + 1710329m) / 112300m;
break;
case "B":
if (lSW_num < 4.0m)
oSW = (500m * lSW_num + 50371m) / 2963m;
else if (lSW_num < 10)
oSW = (250m * lSW_num + 25449m) / 1497m;
break;
case "C":
if (lSW_num < 1.7m)
oSW = (4000m * lSW_num + 409927m) / 21980m;
else if (lSW_num < 5.3m)
oSW = (800m * lSW_num + 86909m) / 4660m;
else if (lSW_num < 10m)
oSW = (200m * lSW_num + 21902m) / 1175m;
break;
case "D":
if (lSW_num < 2.2m)
oSW = (10000m * lSW_num + 1242163m) / 61100m;
else if (lSW_num < 5.0m)
oSW = (5000m * lSW_num + 621387m) / 30550m;
else if (lSW_num < 8.5m)
oSW = (2000m * lSW_num + 248677m) / 12220m;
else if (lSW_num < 10m)
oSW = (2500m * lSW_num + 310999m) / 15275m;
break;
case "E":
if (lSW_num < 4.0m)
oSW = (100m * lSW_num + 13222m) / 601m;
else if (lSW_num < 10m)
oSW = (10000m * lSW_num + 1317201m) / 59900m;
break;
}
oSW = Math.Round(oSW, 2);
return oSW; // this will spit out a decimal, e.g. 20.15
}
【问题讨论】:
-
反向操作甚至是一个函数吗?我的意思是每个特定的十进制格式都会映射到一个精确的重量吗?
-
如果这些应该是 logrythmic,为什么不使用
Math类来执行实际的 logrythms? -
@ryanyuyu 我相信这是一对一的,我有一个与之配套的图表。我现在想到,与其想出一个聪明的方法来做到这一点,我可以更多轻松地以某种方式交叉引用图表。
-
@Aravol 这不是 logrythmic,lorythmic 不是错字。
-
@Andy 明白了。如果您交叉引用图表,请注意在比较代码中的非整数值时会有一些非常讨厌的怪癖,您需要进行舍入而不是执行简单的查找
标签: c#