我知道標題不夠清楚,讓我解釋一下。我正在研究一個關於計算大地座標的迭代算法的項目,這是它的第一部分。基本上程序正在使用文本框輸入做一些迭代計算。它將文本框輸入轉換爲單個,將其用於計算,然後轉換爲字符串作爲輸出。在某些情況下,我需要將輸出用作後續進程的輸入,但問題是,它會給出稍微不同的結果。例如,這些是x,y,z在線計算器的結果:1114125.84474949,-4844708.42056692,3982826.71498173;這些是我的1114125.55452963,4844708.5526556,3982826.75245773。這是什麼原因? (不要介意y的缺失)。總結一下,我想知道如果將文本文本轉換爲單個文本,然後將它們轉換爲字符串會導致此錯誤。我希望問題清楚。是否Convert.ToSingle()然後System.Convert.ToString()導致雙輸入計算錯誤?
這裏是給出我上面提到的結果的代碼的一部分。如果我可以解決問題,更復雜的迭代也可以像這樣工作。
private void button1_Click_1(object sender, EventArgs e)
{
this.timer1.Start(); // it's beside the point
double fi = Convert.ToSingle(phi.Text);
double lamda = Convert.ToSingle(lambda.Text);//lamda is input, lambda is textbox
double yuk = Convert.ToSingle(height.Text);
double a = Convert.ToSingle(aa.Text);
double b = Convert.ToSingle(bb.Text);
double ec = (Math.Pow(a, 2) - Math.Pow(b, 2))/Math.Pow(a, 2); //eccentricity
double N = a/Math.Sqrt(1 - ec * Math.Pow(Math.Sin((Math.PI/180) * fi), 2));
double xx = ((N + yuk) * Math.Cos((Math.PI/180) * fi) * Math.Cos((Math.PI/180) * lamda));
double yy = ((N + yuk) * Math.Cos((Math.PI/180) * fi) * Math.Sin((Math.PI/180) * lamda));
double zz = ((Math.Pow(b/a,2) * N + yuk) * Math.Sin((Math.PI/180) * fi));
coorx.Text = System.Convert.ToString(xx); //xx, yy, zz are textboxes
coory.Text = System.Convert.ToString(yy);
coorz.Text = System.Convert.ToString(zz);
}
使用二進制浮點數做*任何操作*都會產生錯誤。所以,在你的標題中簡短的回答你的問題,是的。更重要的一點是,可能有很多可以改進的地方,但我注意到的第一件事是你將數據存儲爲'double',但是使用'Convert.ToSingle()'。你爲什麼要轉換爲32位數字並將其存儲爲64位數字? –
您還可以添加您獲得這些結果的輸入值嗎?所有的計算都是用'double'完成的,但是輸入首先轉換爲'float' - 這可能會導致不必要的精度損失。 –
正如@GlorinOakenfoot和@JakubLortz所說的,當你的變量是'double'(雙精度)時,轉換'ToSingle'(single-precision,'float')是很奇怪的。你爲什麼這樣做?! –