Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Принципиальные отличия float и intval 
:(
    Опции темы
capitan
Дата 3.11.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 9
Всего: 13



Собственно возник такой вопрос в одном из топиков. Дабы не засорять его, выношу обсуждение сюда.
Я в своих проекта всегда использую (float)  исхожу из того что:
Код

<?      
$num = '12345678910';
echo intval($num).'<br />';
echo (float)$num;
?>


Дает такие результаты:
2147483647
12345678910

В нагруженных проектах есть поле id, которое auto_increment. Есть вероятность, что когда-то мы поймаем такую багу с intval($num)

Кто что скажет?
PM MAIL WWW ICQ   Вверх
NNaarreekk
Дата 3.11.2009, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



capitan, ну ты и оптимистsmile
Пока на сайте дойдет до миллиарда записей, то уже наверно в место РНР еще что-нибудь придумают)))

А вообще если есть конкретно ошибка при интвал значит его не нужно использовать в этом случае, ИМХО.
PM MAIL WWW   Вверх
Kevin
Дата 3.11.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 20.11.2005

Репутация: 2
Всего: 2



Вероятность есть, а в PHP единственный тип данных для больших чисел — float.
PM MAIL   Вверх
Ипатьев
Дата 3.11.2009, 14:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



может быть, кто-нибудь здесь осилит раздел документации, посвященный типам данных?
PM MAIL   Вверх
sTa1kEr
Дата 3.11.2009, 14:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(capitan @  3.11.2009,  13:40 Найти цитируемый пост)
Есть вероятность, что когда-то мы поймаем такую багу с intval($num)

Это не бага. http://php.net/int

Это сообщение отредактировал(а) sTa1kEr - 3.11.2009, 14:23
PM MAIL   Вверх
Simpliest
Дата 3.11.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(Ипатьев @  3.11.2009,  14:10 Найти цитируемый пост)
посвященный типам данных

А зачем? smile
И типам данных чего? MySQL? PHP?

В теории 2млрд записей хватит на 68 лет при скорости 1 запись в секунду smile
Если мы увеличим скорость до 100к в секунду, то всего около 6 часов.

Другой вопрос, что тогда автоинкрементный id скорее всего будет несколько неактуален smile В ход пойдут составные ключи как минимум.

С флоатом тоже не все так гладко smile Значимых цифр там всего 14 smile Ровно на 4ре больше чем у целочисленных.

Ну и на закуску.... В теории при переходе на полностью 64 битные системы ваше целое число вырастет smile до 9000 трлн smile
Поправка smile до 9 000 000 трлн с 19ю значащими цифрами

Это сообщение отредактировал(а) Simpliest - 3.11.2009, 14:30


--------------------
user posted image
PM   Вверх
youri
Дата 3.11.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



при использовании prepared statements (mysqli) intval/float не нужны, т.е. id всегда будет храниться в виде строки. Да и для mysql не обязательно, можно просто проверять, что id (пришедший от пользователя) содержит только цифры
PM   Вверх
sTa1kEr
Дата 3.11.2009, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(Simpliest @  3.11.2009,  15:28 Найти цитируемый пост)
А зачем? smile

Затем, что там расписано до мелочей все то, что написали вы, плюс еще очень много полезной информации.
PM MAIL   Вверх
youri
Дата 3.11.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



кстати, кто-нибудь знает, до каких пор можно рассчитывать, что "целочисленная" строка преобразуется в float без потерь? Я так понимаю до 2**52-1?
PM   Вверх
Kevin
Дата 3.11.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 20.11.2005

Репутация: 2
Всего: 2



Цитата(youri @ 3.11.2009,  14:53)
при использовании prepared statements (mysqli) intval/float не нужны, т.е. id всегда будет храниться в виде строки. Да и для mysql не обязательно, можно просто проверять, что id (пришедший от пользователя) содержит только цифры

Не напомните, что совершенно случайно передается первым аргументом в bind_param()? smile  

--
Про БД конечно не совсем это актуально, но, как 
я понял, топикстартер просто привел неудачный пример,
иллюстрируя несколько другую идею.

Это сообщение отредактировал(а) Kevin - 3.11.2009, 15:08
PM MAIL   Вверх
Simpliest
Дата 3.11.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(youri @  3.11.2009,  14:59 Найти цитируемый пост)
кстати, кто-нибудь знает, до каких пор можно рассчитывать

Я же ответил
Цитата(Simpliest @  3.11.2009,  14:28 Найти цитируемый пост)
Значимых цифр там всего 14


Плясать лучше отсюда 
http://www.psc.edu/general/software/packages/ieee/ieee.php

2 цифры уйдут на округление.

Добавлено через 1 минуту и 7 секунд
Kevin, для очень больших чисел всегда есть GMP и BCMath
100 знаков точности - не предел.


--------------------
user posted image
PM   Вверх
Kevin
Дата 3.11.2009, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 20.11.2005

Репутация: 2
Всего: 2



Цитата(Simpliest @ 3.11.2009,  15:08)
Kevin, для очень больших чисел всегда есть GMP и BCMath
100 знаков точности - не предел.

К самому PHP они относятся слабо, 
и не отменяют того, что есть только int и float. 
А тот же BCMath, в конечном счете, отдает простую строку.

P.S.: Вообще, о чем спор? Есть int, есть float, есть разные уловки 
и библиотеки как преодолеть ограничения, о чем топик? 

PM MAIL   Вверх
capitan
Дата 3.11.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 9
Всего: 13



Цитата(Kevin @ 3.11.2009,  15:21)
P.S.: Вообще, о чем спор? Есть int, есть float, есть разные уловки 
и библиотеки как преодолеть ограничения, о чем топик?

Сразу скажу, я не теоретик, а практик. Просто зашел спор как приводить полученную переменную. Я привожу всегда (float), Ипатьев говорит что нужно использовать intval.  Я привел пример, может и не удачный, но исходя из чего я исходил. Можно было конечно привести пример online калькулятора. Вот хочу понять, когда применять intval, а когда float.


PM MAIL WWW ICQ   Вверх
bars80080
Дата 3.11.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



для случаев где проверяется число менее 11 знаков - intval, для случаев большего - 

Код

if(!empty($_POST['id'])) $id = preg_replace('/[^0-9]/', '', $_POST['id']);
if(empty($id)) $id = 0;


100%-вариант
PM MAIL WWW   Вверх
Ипатьев
Дата 3.11.2009, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



Насколько я помню, с вещественными числами могут быть проблемы.
Когда 1111111111 станет вдруг 1111111110.99999999
Сейчас, правда, воспроизвести их не удалось. 
Но, на мой взгляд, функцию надо применять по назначению. Если нам нужно целое - мы приводим к целому. Если нужно вещественное - приводим к вещественному. Не наоборот.
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0980 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.