5

I have a table that stores longitude and latitude coordinates (google maps) i have the columns defined as float however when i try to insert a value -61.45859899999999 and 10.28289 they are being rounded off to -61.46 and 10.30. How can i modify the columns to hold the data as is.

I am using mysql toad. Under is the code for the table:

CREATE TABLE `tblGeoCodes` (
  `recNo` int(11) NOT NULL AUTO_INCREMENT,
  `longLocation` float(30,2) DEFAULT NULL,
  `latLocation` float(30,2) DEFAULT NULL 
1

4 Answers 4

13

There are two problems with your implementation.

The reason the values are both being rounded to 2 digits of precision is that you explicitly defined the scale as 2.

Also, FLOAT is an imprecise data type in MySQL.

To solve both problems you should use the DECIMAL data type with an appropriate precision and scale.

For example, something like this:

CREATE TABLE `tblGeoCodes` (
  `recNo` int(11) NOT NULL AUTO_INCREMENT primary key,
  `longLocation` decimal(18,14) DEFAULT NULL,
  `latLocation` decimal(18,14) DEFAULT NULL
); 

Example:

mysql> CREATE TABLE `tblGeoCodes` (
    ->   `recNo` int(11) NOT NULL AUTO_INCREMENT primary key,
    ->   `longLocation` decimal(18,14) DEFAULT NULL,
    ->   `latLocation` decimal(18,14) DEFAULT NULL
    -> ); 
Query OK, 0 rows affected (0.02 sec)

mysql> 
mysql> insert into tblGeoCodes (longLocation,latLocation) values(-61.45859899999999 , 10.28289);
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> select * from tblGeoCodes;
+-------+--------------------+-------------------+
| recNo | longLocation       | latLocation       |
+-------+--------------------+-------------------+
|     1 | -61.45859899999999 | 10.28289000000000 |
+-------+--------------------+-------------------+
1 row in set (0.00 sec)
Sign up to request clarification or add additional context in comments.

1 Comment

i tried this and i am getting -61.45860000000000 when i insert -61.45859899999999 how can i prevent this?
5

The ,2 in float(30,2) represents 2 decimal places. I use float(10,6) as this is adequate to hold coordinates

5 Comments

Well, six decimal points is about 2 inches at the equator (or any line of longitude), so if that is sufficient accuracy, you're okay with 6 decimal places. It depends for what purpose you're using latitude and longitude.
As OP is using coordinates in Google Maps and most GPS systems are accurate to about 10 meters, 6 decimal places is adequate
Overkill, rather than adequate, I would suggest. Four decimal points is 18.3 feet (5.6 m), so you could save some space and some calculation time if you stored 4 instead of 6.
10 - 6 = 4, the sign doesn't count (that comes from the (un)signed specification.
Google themselves recommend 10,6: developers.google.com/maps/articles/phpsqlsearch_v3
0

I'd suggest converting to MYISAM to take advantage of GSI. It is better suited for that purpose and should perform better.

However, as already suggested, increasing precision of float fields might be a simpler solution. Since you're tagged the question as google-maps releted I'd also recommend this tutorial at Google's dev site.

2 Comments

would i have the float being inserted as is without round the value?
Perhaps I didn't give the most practical answer. I've edited to more useful (I hope).
0

Bare in mind that FLOAT(10,6) makes no sense, this reserves 4 digits for the integer part.

Personally, I prefer DOUBLE(9,6) but you might use FLOAT instead to save the 4 extra bytes.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.