2015-12-15 59 views
1

我知道標題不夠清楚,讓我解釋一下。我正在研究一個關於計算大地座標的迭代算法的項目,這是它的第一部分。基本上程序正在使用文本框輸入做一些迭代計算。它將文本框輸入轉換爲單個,將其用於計算,然後轉換爲字符串作爲輸出。在某些情況下,我需要將輸出用作後續進程的輸入,但問題是,它會給出稍微不同的結果。例如,這些是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); 
    } 
+1

使用二進制浮點數做*任何操作*都會產生錯誤。所以,在你的標題中簡短的回答你的問題,是的。更重要的一點是,可能有很多可以改進的地方,但我注意到的第一件事是你將數據存儲爲'double',但是使用'Convert.ToSingle()'。你爲什麼要轉換爲32位數字並將其存儲爲64位數字? –

+1

您還可以添加您獲得這些結果的輸入值嗎?所有的計算都是用'double'完成的,但是輸入首先轉換爲'float' - 這可能會導致不必要的精度損失。 –

+0

正如@GlorinOakenfoot和@JakubLortz所說的,當你的變量是'double'(雙精度)時,轉換'ToSingle'(single-precision,'float')是很奇怪的。你爲什麼這樣做?! –

回答

-1

計算機使用二進制格式,以存儲在存儲器中的數字,在additon存在着用於存儲這些值的位的數量有限(取決於其使用的類型),因此轉換字符串值的,它是以十進制數字格式給出的,並且是單/雙類型(所以實數值)與精度的降級有關。