- 締切済み
VB2005でで正しい計算結果が出ません。
VB2005でで正しい計算結果が出ません。 こんにちわ。プログラミング初心者です。どうかよろしくお願いします。 緯度経度を変換する計算式をプログラムしたのですが、計算結果が間違って出力されます。 下にプログラムを書くのでどこがおかしいのか、またどうすれば正しい計算結果が求められるのかを教えてください。お願いします。 ちなみにTextBox22には 3601.4589 、 TextBox23には 13942.9930 のような数字が入っています。 Private Sub seriWork() Dim buffer, buffer2() As String Dim di1, di2, dk1, dk2 As Double '~通信に関するところなので中略します~ '~ここから先が計算です~ 'Dの緯度百分率変換表示 TextBox22.Text = dN di1 = Double.Parse(Mid(TextBox22.Text, 1, 2)) di2 = Double.Parse(Mid(TextBox22.Text, 3, 7)) TextBox14.Text = di1 + (di2 / 60).ToString() 'Dの経度百分率変換表示 TextBox23.Text = dE dk1 = Double.Parse(Mid(TextBox23.Text, 1, 3)) dk2 = Double.Parse(Mid(TextBox23.Text, 4, 7)) TextBox15.Text = dk1 + (dk2 / 60).ToString() Me.Invoke(New ReDelgate(AddressOf completed)) End If Loop Catch ex As Exception MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) Finally If SerialPort1.IsOpen = True Then SerialPort1.Close() End Try End If この計算の意図は、GPSレシーバーから受信される「3601.4589」のような形の座標形式を googl mapで表示できる座標に変換するものです。 たとえば、シリアルポートでGPSから受信した緯度が3601.4589 の場合は、「=36 + (1.4589 / 60)」と計算すると 36.024315 のような形になります。 あと、3601.4589 を 36と1.4589で分割するためにMidを使用しています。 /60は公式です。 上記プログラムだと 62.3333333 のような誤解答が出てきます。 どうか教えてください。お願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
Doubleで取り込んで \(商演算子)で 度と 分秒部を分離してみては dim tmp, di1, di2, res as Double if TryParse( dE, tmp ) then di1 = tmp \ 100 di2 = ( tmp - di1 * 100 ) / 60 res = di1 + di2 end if といった具合にしてみてはいかがでしょう
- BellBell
- ベストアンサー率54% (327/598)
Dim di1, di2 As Double Dim strDN As String strDN = "3601.4589" di1 = Double.Parse(Mid(strDN, 1, 2)) di2 = Double.Parse(Mid(strDN, 3, 7)) MsgBox(di1 + (di2 / 60).ToString()) TextBox1.Text = "3601.4589" di1 = Double.Parse(Mid(TextBox1.Text, 1, 2)) di2 = Double.Parse(Mid(TextBox1.Text, 3, 7)) MsgBox(di1 + (di2 / 60).ToString()) TextBox2.Text = di1 + (di2 / 60).ToString() シンプルに作成した限りでは、誤答は出せませんね。 という事で、計算ロジックの問題ではないと仮定して、他の可能性を考えてみると。 1)TextBox14,15などのデフォルトの名前のせいで混乱し、答えが表示されているハズと凝視しているのは別のテキストボックスだった。 2)同様にTextBox22,23に、GPSから受信したデータが表示されているハズと思っていたのは別のテキストボックスだった。 3)実は、それらTextBoxは非表示になっていたので、画面上表示されていなかった。(表示されているように見えたのは、同じ位置に置いてあるラベルであった) 4)それらテキストボックスには、数字の桁数を見るためなど画面デザインの都合で、別の場所で固定の値を設定して、取得した値、または計算した結果が上書きされてしまっていた。 5)質問内コードの"Loop"、これがあるからには当然While(Until)が存在するはずだが、その位置や終了条件のせいで、受信データを設定しても計算結果を設定していなかった。(GPSデータTextBoxには最後に取得した値、計算結果TextBoxには前回のループで取得した値を元にした計算結果が表示されている) 計算ロジックの問題ではないでしょうから、別の角度から正しい値が表示されない理由を考えてみてください。
- ShowMeHow
- ベストアンサー率28% (1424/5027)
私がこういう計算をするときは 元の数字を100で割った整数値を求め、 あまった数値を60でさらに割ると思います。 MOD DIV 関数はそのような目的のためにあります。 (文字に変換したり、数値に戻したりするとわかりにくくなります)