Въпрос за phpMyAdmin

bganonymous

Registered
Какъв type да използвам на полето в случай че числото не е цяло (например: 13,58)? int?
 
teroristd каза:
Мисля че double е правилното, int закръгля на цяло число.
Може и флоат.

Тук много добре е обяснена разликата между float и double. Double се ползва за по-голяма точност на числото защото се запаметява в двойно повече битове. Флоат има 32 бита (4 байта) с 8 позиции за точност. Дабъл има 64 бита (8 байта) и 16 позиции за точност. Ако числата, които ще въвеждаш не са с примерно повече от 0.12345678 (8) позиции не си ползвай float за спестяване на памет. В противен случай double е твоето решение с 0.123456789 10 11 12 13 14 15 16 (16) позиции на точност.

If you need better accuracy, use Double instead of Float.


http://stackoverflow.com/questions/2160810/mysql-whats-the-difference-between-float-and-double

:?: :arrow:


They both represent floating point numbers. A FLOAT is for single-precision, while a DOUBLE is for double-precision numbers.

MySQL uses four bytes for single-precision values and eight bytes for double-precision values.

There is a big difference from floating point numbers and decimal (numeric) numbers, which you can use with the DECIMAL data type. This is used to store exact numeric data values, unlike floating point numbers, where it is important to preserve exact precision, for example with monetary data.

:arrow:

Perhaps this example could explain.

[sql]CREATE TABLE `test`(`fla` FLOAT,`flb` FLOAT,`dba` DOUBLE(10,2),`dbb` DOUBLE(10,2)); [/sql]

We have a table like this :

[sql]+-------+-------------+
| Field | Type |
+-------+-------------+
| fla | float |
| flb | float |
| dba | double(10,2)|
| dba | double(10,2)|
+-------+-------------+[/sql]

For first difference, we try to insert a record with '1.2' to each field :

[sql]INSERT INTO `test` values (1.2,1.2,1.2,1.2);[/sql]

The table showing like this :
[sql]
SELECT * FROM `test`;

+------+------+------+------+
| fla | flb | dba | dbb |
+------+------+------+------+
| 1.2 | 1.2 | 1.20 | 1.20 |
+------+------+------+------+[/sql]

See the different?

We try to next example:
[sql]
SELECT fla+flb, dba+dbb FROM `test`;[/sql]

Hola! We can find the different like this :
[sql]
+--------------------+---------+
| fla+flb | dba+dbb |
+--------------------+---------+
| 2.4000000953674316 | 2.40 |
+--------------------+---------+[/sql]
 
Примера е абсолютно неуместен със сравнението между float и double. А да видим дали ще се сетиш какво не му е наред :)
 
lamerko каза:
Примера е абсолютно неуместен със сравнението между float и double. А да видим дали ще се сетиш какво не му е наред :)
Незнам кое не му е уместното примера го копнах от другият сайт като поставих и връзката към него. Не сравних int с doble ли какво? Колегата над мен предложи дабъл аз просто отговорих, че може да използва и флоат, като ги сравних. Не е проблем да ползва и поле от типа VARCHAR но говорим за числа.

ПС:
Аха видях : double (10,2) но явно просто е дадено за примера и обяснението. :oops:

Най-просто казано ако полето ти е float и имаш число с 16 символа след десетичната запетая ще го отреже и числото ще стане с 8 символа. А ако имаш поле double ако имаш число с 10 символа или до 16 символа включително ще ги запамети с тази точност. От там нататъка ги реже. Просто примера наистина е неточен но се схваща и от него малко.
 
Аз бих използвал decimal(10,2) :oops: Не ми е създавало проблем при бъдещи аритметични операции .
 
Когато правиш опреации с двоични числа, резултата си има вътрешно представяне. Това как ще се презентира и запише - вече е съвсем отделен процес и е свързан с допълнително закръгляне и съответно загуба на данни.

Ето един прост пример за вътрешно представяне при аритметична операция:

[sql]SELECT FLOOR((0.1+0.7)*10)[/sql]

Класическия случай - очакваме 7, но резултата е 8. Сега ако обновите данниет във въпросната табличка test с 0,1 и 0,7 и за двата типа и повторите горната заявка - и при случая с float и с double резултата ще бъде 7.

Сега за нелепостта на примера:

[sql]CREATE TABLE `test`(`fla` FLOAT,`flb` FLOAT,`dba` DOUBLE(10,2),`dbb` DOUBLE(10,2));[/sql]

Проблема с примера:


[sql]+--------------------+---------+

| fla+flb | dba+dbb |

+--------------------+---------+

| 2.4000000953674316 | 2.40 |

+--------------------+---------+[/sql]

Тук също се наблюдава много лоша интерпретация на числото. И проблема е заради точността при вътрешната операция, при което се получава закръгляне след 7-мия знак на дробната част. А защо е така? Ами ползваме операнд с 4 байта и 8 байтова операция. Естествено, защото MySQL използва двойната прецизност при операциите. Разбира се, ако таблицата беше създадена по аналогичен начин и за двата типа:

[sql]CREATE TABLE `test`(`fla` FLOAT,`flb` FLOAT(10,2),`dba` DOUBLE(10,2),`dbb` DOUBLE(10,2));[/sql]

резултата щеше да бъде абсолютно еднакъв и при двете. Какво би се случило, ако се опитаме да сложим рамка с двойна прецизност и на двата типа? Може да стане това, но така или иначе излизаме от 4-те байта и пак ще има закръгляне. Най-лесно може да се види какво се получава ако се дефинира някое поле по следния начин:

[sql]`fla` FLOAT(26,25)[/sql]

Тогава презентацията на числото 1,2 ще бъде нещо от рода 1,2000000476837158000000000

Лошо.
Защо примера не е коректен? Ами просто защото не поставяме двата типа в равноправна позиция. Ако направим таблицата така, че да отговаря на типовете, то тя би изглеждала по следния начин:

[sql]CREATE TABLE `test`(`fla` FLOAT(7,6),`flb` FLOAT(7,6),`dba` DOUBLE(26,25),`dbb` DOUBLE(26,25));[/sql]

и съответно резултата от заявката ше бъде 2,400000 за FLOAT() и 2,4000000000000000000000000 за DOUBLE()

И в заключение - за да не стават неприятни ситуации, свързани с точките на прецизност - ползвайте DOUBLE, а ако става въпрос за пари - DECIMAL.
 
Както казах примера го копнах от:

http://stackoverflow.com/questions/2160810/mysql-whats-the-difference-between-float-and-double

Ламерко уточнението ти е правилно, благодаря. Пак ще повторя, че ако се иска спестяване на памет и числата не изискват толкова голяма прецизност. Реално винаги съм използвал double но това е друга тема. :)
 

Back
Горе