- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Что делать, если ваша email-рассылка попала в спам
10 распространенных причин и решений
Екатерина Ткаченко
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Вот удалось открыть чудо для себя.
$str1=10.20*100;
$str2=(int)$str1;
$str3=floor(10.20*100);
echo "$str1 $str2 $str3";
данный код выведет
1020 1019 1019
$str1=10.30*100;
$str2=(int)$str1;
$str3=floor(10.30*100);
echo "$str1 $str2 $str3";
за то этот выведет
1030 1030 1030
PHP 5.2.16/5.2.17 , в чём прикол?
Глюки в памяти? Баг php?
округление работает (выж дробь к целочисленному приводите)
почитайте правила округления
бага нет.
---------------------------------------------------------------------------------
хотя да - почему то такое тока при 10.20 а при 1.2 уже нормально - странноо ))
Anamnado добавил 09.02.2011 в 01:24
но ведь вот так правильно будет
<?php
$str1=10.2*100;
$str2=(float)$str1;
$str3=floor(10.2*100);
echo "$str1 $str2 $str3";
значит дело в округлении.. имхо )..
Глюки в памяти? Баг php?
особенности хранения и обработки дробных чисел в бинарных системах.
Anamnado ну а 3я строка ведь не верна!
Как минимум баг, в 5.3 тоже, посмотрите внимательно.
10.2*100 = 1020, оно так и выводится
Может оно в памяти и как float, но математически и визуально 1020
если уже целое число сделать ещё раз целым (int)1020, почему оно становится таким? 1019
Почему только на некоторые числа такое воздействие, где логическое объяснение?)
Учитывая действие floor, системно ошибку я вижу примерно так: 10.2*100 = 1019.99999999
Это баг привидения чисел, если писать код на Си, такого не возникнет.
Dimanych добавил 09-02-2011 в 15:41
Python подтвердил моё опасение...
>>> str = 10.20*100
>>> str
1019.9999999999999
>>> str = int(str)
>>> str
1019
>>> import math
>>> math.floor(10.20*100)/100
10.19
Это что на всех языках так?
Это называется "проблемы при работе с числами с плавающей запятой и их представлением в компьютере".
Дело в том, что числа хранятся в двоичной системе счисления в виде мантиссы (кроме первой цифры) и порядка. Некоторые числа (например, 0.2, 0.4, 0.6, 10.20) нельзя представить в виде конечной двоичной дроби, так как их запись - периодична. Из-за этого возникает погрешность округления. Наиболее хорошо это показывает командная строка питона:
>>> 0.4
0.40000000000000002
>>> 0.6
0.59999999999999998
Но добрые математики придумали решение проблем с округлением и кучей девяток - перед округлением достаточно прибавлять к округляемому что-то очень маленькое, и решать этим проблему:
>>> eps=1e-9
>>> floor(10.20*100)
1019.0
>>> floor(10.20*100 + eps)
1020.0
Вроде как даже проходят в школе :)
Anamnado
1019.9999999999999
да я об этом сразу и подумал - но не знаю почему так.
Boris A Dolgov, вот наверно лучше знает )))
Ну вот блин, плохо быть самоучкой :)
Я считаю что это как то должно решаться на системном уровне, а не руками программиста :)
http://xpoint.ru/know-how/Articles/FloatingPointNumbers?comments
Я считаю что это как то должно решаться на системном уровне, а не руками программиста :)
Что конкретно Вы решать предлагаете? Отменять правила математики? Считать напрямую в десятичной арифметике?
http://xpoint.ru/know-how/Articles/FloatingPointNumbers?comments
Ошибки только кажет.
Ну вот блин, плохо быть самоучкой :)
Я считаю что это как то должно решаться на системном уровне, а не руками программиста :)
http://xpoint.ru/know-how/Articles/FloatingPointNumbers?comments
Приказом президента Российской Федерации на период кризиса считать число Пи равным тройке!
Ух, началось, вы хоть вдумайтесь прежде чем писать!
После 10.20*100, PHP выводит целое число, если оно его выводит, почему бы сразу не представить его в памяти именно целым 1020? PHP ведь всё равно меняет типы на лево и на право. Зачем этот изврат конфликтов? И не умрёт интерпретатор поправив этот косяк ;)
Либо выводить уже как и питон, что подчёркивает этот бинарный глюк, либо править по факту.
После 10.20*100, PHP выводит целое число
Два. Строку символов он выводит, а не число.
А вот в $str1 - у Вас действительно "число" в формате с плавающей точкой (посмотрите var_dump(), например). Use printf, Luke.
PHP ведь всё равно меняет типы на лево и на право.
"Не налево и направо", а во вполне определенных случаях. Документацию будем читать?
Вообще, в там есть жырный warning, в деталях описывающий именно Вашу ситуацию (см. http://ru.php.net/manual/en/language.types.float.php). "Проглядеть" такое можно только по одной причине - если в документацию не смотреть. Вообще.
Либо выводить уже как и питон, что подчёркивает этот бинарный глюк, либо править по факту.
Это не глюк, а арифметика.