![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
Leoo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 270 Регистрация: 3.10.2005 Где: г. Обнинск Репутация: 1 Всего: 3 |
почему данное выражение выдает false -------------------- Если вы не страдаете паранойей, это не значит, что они за вами не летят! |
|||
|
||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
Потому что числа с плавающей точкой сравнивать на равенство бесполезно Будут округления. Правильнее сравнивать на диапазон точности value - delta < calculatedValue < value + delta Где delta это требуемая тебе точность А value это собственно значение с которым ты сравниваешь. -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
Arantir |
|
||||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 16 Всего: 55 |
Наглядно:
Это сообщение отредактировал(а) Arantir - 14.8.2013, 20:28 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||
|
|||||
Cript777 |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 30.10.2012 Репутация: нет Всего: нет |
А ты вот так попробуй.. У меня лично true выдает.
Это сообщение отредактировал(а) Cript777 - 14.8.2013, 23:31 |
||||||
|
|||||||
Arantir |
|
|||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 16 Всего: 55 |
А слово "float" всегда обозначает одну и ту же технологию хранения и арифметических операций. Соответсвенно, float всегда означает неточность, которая исходит из самого принципа его работы.
Во многих других языках класс для точных вычислений является встроенным и поддерживается на уровне языка. Такой класс/тип данных принято называть Decimal. PHP в первую очередь создан для выдачи динамически сформированного HTML-кода браузеру... Собственно, об этом говорит сама аббревиатура "PHP". Так что, если эта тема была создана для решения некой проблемы, а не только из-за непреодолимой жажды к познанию, пониманию и осознанию, то: Для бытовых потребностей:
Для научных (точных) вычислений: http://www.php.net/manual/ru/ref.bc.php Поддержки на уровне языка нет. Но есть библиотечка с функциями. Работает со строками. Впрочем, это не проблема с динамической-то типизацией. Это сообщение отредактировал(а) Arantir - 15.8.2013, 02:13 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
Leoo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 270 Регистрация: 3.10.2005 Где: г. Обнинск Репутация: 1 Всего: 3 |
просто эта проблема проявляется только для $p1 = 2 или 3, $p2 = 4 или 6 и чтоб полученные результат был 6 или 9, причем все равно какое целое число впереди, главное чтоб десятые были такими.
но если $p1 будет равно 1.1 или какому нибудь другому числу, то результат уже тру т.е прослеживается две последовательности (2,4,6) или (3,6,9) если эти числа будут в сотых, то опять же результат будет тру работу проверил на 5 разных машинах и с виндой и с убунтой и с макосью способ как ее решить тоже нашел, просто очень интересно в чем секрет. -------------------- Если вы не страдаете паранойей, это не значит, что они за вами не летят! |
|||
|
||||
Arantir |
|
||||||||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 16 Всего: 55 |
Leoo, есть такое понятие - бесконечные дроби...
Так вот, в двоичной системе оно тоже есть. Но вот загвоздка в том, что в двоичной и десятичной это не одни и те же числа. Да и вообще в двоичной конечных дробей поменьше. То что для человека 0.3, для компьютера — что-то вроде 001111101.001100110011001100110011... А в обратную сторону это уже не 0.3, "почти 0.3". Суть та же, что для записей чисел 1/3 и 0,33333333333333333333333333333333. Многие числа изначально неточны:
Числа в двоичном виде - это суммы степеней двойки. В том числе степеней отрицательных (нолики и единички после запятой). Точно могут быть представлены только числа, являющиеся суммой 0.5, 0.25, 0.125, 0.0625 и так далее...
Представьте, что Вы с компьютером поменялись местами. У вас есть карандаш и узкий длинный листок бумаги. Записывать числа вы умеете только в виде десятичных дробей и ограниченной длины. А отвечать Вы должны с некой заданной точностью, например, 16 знаков. Вас просят сложить числа 1/3 и 2/3 Вы их превращаете в дроби и складываете 0,66666666666666666666666666666666 0,33333333333333333333333333333333 получаете 0,99999999999999999999999999999999 Вы берете 17 знак и округляете. Получается ровно 1. А потом вас просят сравнить (1/3 + 2/3) и 1 Вы сравниваете 0,99999999999999999999999999999999 1,00000000000000000000000000000000 и выдаете "НЕ РАВНО". -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||||||
|
|||||||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |