这是我的代码
private double wordcompare(word a, word b)
{
if (a.AtTheEndOf(b))
return -1;
double matchPer=word.Compare( a,b);
Console.WriteLine(matchPer);
a.shiftToleft();
double nextMatchPer = wordcompare(a, b);
return matchPer > nextMatchPer ? matchPer : nextMatchPer;
}
Compare()方法比较2个单词并返回匹配字母的百分比 shifttoleft()方法将比较的单词虚拟地移动一步, 我已经调试了每一步,当它到达Compare()的返回时有2/3或1/3的数字,但是当我打印返回的值时它显示0除了第一个呼叫帮助请。
word class
class word
{
public static double Pertolarnce = 0.2;
private int pos;
public int wordTolarnce;
string letters;
public int Pos { get{ return pos; } }
public word(string s)
{
letters = s;
wordTolarnce=(int)Math.Round(Pertolarnce * s.Length, MidpointRounding.AwayFromZero) ;
pos = 0 - wordTolarnce;
}
public void shiftToleft()
{
pos++;
}
public int Len { get { return letters.Length; } }
public static double Compare(word a,word w)
{
int comLeters = 0;
int matchedLeters = 0;
int i, j;
i = 0 - a.pos;
j = 0 + a.pos;
i=i < 0 ? 0 : i;
j=j < 0 ? 0 : j;
while(i<a.Len && j<w.Len )
{
comLeters++;
if (a.letters[i] == w.leterAt(j))
matchedLeters++;
i++;
j++;
}
return matchedLeters / comLeters;
}
private char leterAt(int index)
{
return letters[index];
}
public bool AtTheEndOf(word w)
{
if(w.Len-this.pos+1 == this.Len-wordTolarnce)
return true;
else
return false;
}
}
的输出
Console.WriteLine(matchPer);
1
0
0
0
0
0
答案 0 :(得分:1)
你的问题是整数除法。 matchedLeters / comLeters
将执行整数除法,这意味着将丢弃任何余数。这意味着,如果matcheLeters
小于comLeters
,则会在您看到后返回0。
要解决此问题,您可以执行以下操作:
return (double)matchedLeters / comLeters;
这将在分割之前将matchedLeters
转换为双精度,这将强制它使用浮点除法。
作为调试提示,如果您已完成(用于调试),您可能已经对问题有了更多了解:
var retVal = matchedLeters/comLeters;
return retVal;
这样可以让您确切了解导致问题的操作。