Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Какой выбрать тип числа?
 
 автор: baston   (10.04.2010 в 15:32)   письмо автору
 
 

Есть таблица, в которой находятся поля: id_product (PK), id_category (FK), name (tinytext), ccal, protein, carbon, fat. Последние четыре поля имеют тип float (4,2).
Добавляю запись:
insert into products ( id_product, id_category, name, ccal, protein, carbon, fat) values ( 0, 5, 'Банан', 90.9, 1.5, 21, 0.1,);
Получаю результат:
2 | 5 | Банан | 90,90 | 1,5 | 9,99 | 0,10

Как можете видеть, цифры для поля carbon совсем не те, что я добавлял.
Изменил тип на Decimal - все то же самое.

Вопрос: какой же тип следует использовать в данном случае, если вводимые данные (цифры) могут содержать десятичные знаки, а могут и не содержать?
Или следует обязательно вводить данные в поля с таким типом по шаблону (то есть с разделителем)?
В книге уважаемого cheops-а не нашел ответ, равно как и в сети...
Спасибо.
Спасибо.

  Ответить  
 
 автор: baston   (10.04.2010 в 16:06)   письмо автору
 
   для: baston   (10.04.2010 в 15:32)
 

Нашел! Тип Double. В этом случае данные добавляются в точности так, как их вводишь.

  Ответить  
 
 автор: Trianon   (10.04.2010 в 19:31)   письмо автору
 
   для: baston   (10.04.2010 в 15:32)
 

>Получаю результат:
>2 | 5 | Банан | 90,90 | 1,5 | 9,99 | 0,10

>Как можете видеть, цифры для поля carbon совсем не те, что я добавлял.

В полях числа лежат, а не цифры. Числа не содержат десятичных или еще каких знаков. Число - это число, математическая величина, а не её текстовое представление.

Числа те же.
А чем Вы получаете результат?
Может быть клиент просто форматирует вывод согласно своим представлениям (или представлениям текущей локали)?

  Ответить  
 
 автор: baston   (10.04.2010 в 21:55)   письмо автору
 
   для: Trianon   (10.04.2010 в 19:31)
 

Нет, я ничего пока не делаю с данными. Никаких запросов. Просто вижу, что отображается в клиенте HeidiSQL после добавления записи. И вижу, что вводимые числа отличаются от отображаемых (вместо числа 21 отображается число 9,99).

  Ответить  
 
 автор: Trianon   (10.04.2010 в 22:05)   письмо автору
 
   для: baston   (10.04.2010 в 21:55)
 

>(вместо числа 21 отображается число 9,99).

А какой тип был у поля?
Может там 21 просто не помещалось?

  Ответить  
 
 автор: baston   (10.04.2010 в 22:18)   письмо автору
 
   для: Trianon   (10.04.2010 в 22:05)
 

float (3,2), а потом decimal (3,2).

  Ответить  
 
 автор: Trianon   (11.04.2010 в 00:40)   письмо автору
 
   для: baston   (10.04.2010 в 22:18)
 

и то и другое - число из трех десятичных разрядов, два из которых - после десятичной точки.

  Ответить  
 
 автор: baston   (11.04.2010 в 09:41)   письмо автору
 
   для: Trianon   (11.04.2010 в 00:40)
 

Прошу прощения, так как я с математикой никогда не дружил и терминология ее меня только путает.
Но цифры в скобках я разумею так: первые цифры определяют общее количество символов до разделителя, цифры после запятой - кол-во символов после разделителя.
Поскольку вводилась цифра 21, то думалось, что будет отображаться 21,00. Но никак не 9,99 (откуда вообще взялась эта цифра я так и не понимаю).
Даже если ввожу цифру 21.0, то все равно отображается эта 9,99.

  Ответить  
 
 автор: baston   (11.04.2010 в 09:46)   письмо автору
 
   для: Trianon   (11.04.2010 в 00:40)
 

Однако я неверно понимал.
Сейчас методом тыка установив в скобках (5,2) я получил желаемое.
Таким образом, цифра 5 означает общее количество символов в цифре, а 2 - кол-во символов после разделителя.
Спасибо, что обратили мое особое внимание на данный момент!

  Ответить  
 
 автор: baston   (11.04.2010 в 09:51)   письмо автору
 
   для: baston   (11.04.2010 в 09:46)
 

Тогда возникает другой вопрос: значения в типе float и decimal хранятся как строки (это я вычитал из книги), а значения в double как вещественные типы. То есть float и decimal это строковые типы поля, а double - цифровой. Верно?

  Ответить  
 
 автор: Trianon   (11.04.2010 в 10:31)   письмо автору
 
   для: baston   (11.04.2010 в 09:51)
 

неверно.
Значения типов float и decimal хранятся вовсе не как строки.
Значения типа float хранятся в обычном float-представлении согласно стандарта.
Значения типа decimal хранятся в виде массива двоично-упакованных 9-разрядных фрагментов.

Все три типа являются числовыми.
Определение "цифровой" использовать не стоит. Слишком туманное.

  Ответить  
 
 автор: Trianon   (11.04.2010 в 10:37)   письмо автору
 
   для: baston   (11.04.2010 в 09:46)
 

>Однако я неверно понимал.
>Сейчас методом тыка
А зачем методом тыка-то?
Там жирным было выделено важное.
Это даже если на минуточку забыть о мануале.

>Спасибо, что обратили мое особое внимание на данный момент!

Теперь Вы можете объяснить, почему в ячейке оказалось 9.99

  Ответить  
 
 автор: baston   (11.04.2010 в 15:10)   письмо автору
 
   для: Trianon   (11.04.2010 в 10:37)
 

>А зачем методом тыка-то?
>Там жирным было выделено важное.
>Это даже если на минуточку забыть о мануале.

Верно, да я в тот момент не понимал написанное. Такое впечатление, будто смотрел, да не видел. Ну, а метод тыка один из лучших способов освоения материала, если при этом возникает понимание. В данном случае, под тыком я понимаю не просто случайный выбор того или иного решения, а последовательное исследование различных вариантов и отсечения неподходящих.

>Теперь Вы можете объяснить, почему в ячейке оказалось 9.99

Могу объяснить так: поскольку было задано общее кол-во чисел 3, то и видим здесь три числа, два из которых после разделителя. И это максимальное число в данном случае. То, что мы бы вводили менее 9,99, отображалось бы правильно, а как только вводим большое число, то срабатывает ограничение.

  Ответить  
 
 автор: Trianon   (11.04.2010 в 17:11)   письмо автору
 
   для: baston   (11.04.2010 в 15:10)
 

Верно. единственное замечание - не числа три, а цифры.
1346461 - это число,
1, 3, 4, 6, - это его цифры.

была задана общая точность величины 3 значащих цифры. Вот три цифры мы и видим.
Ближайшее число к 21, кторое помещается в сетку x.xx будет как раз 9.99

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования