ОсновноеRadiotalkПользовательское
Программирование
6   •   Посмотреть все темы

Секреты подводного мира PHP

 

20090
Dimitry @Dimitry
$str=10.20*100;
echo $str;

$str=(int)$str;
echo $str;

echo floor(10.20*100)/100;

данный код выведет
1020 1019 10.19

$str=10.30*100;
echo $str;

$str=(int)$str;
echo $str;

echo floor(10.30*100)/100;

за то этот выведет
1030 1030 10.30


Кто знал этот секрет? 😀

3473
Фарид @F_a_R_i_D
нам рыболовам этого ещё не понять)

2349
redsymbzone @redsymbzone
да скорее всего на баг похоже, но приколько, теперь 1020 вычеркну из головы, иначе кто знает, может подсчеты будут неверны xD

Отредактировано redsymbzone - 09.02.2011
20090
Dimitry @Dimitry
Протестировал диапазон, таких чисел очень много.
Причём очень много таких которые одинаковы визуально но не равны через оператор ==, этот баг ещё хуже)
нужно быть осторожнее с floor, ceil, round, (int)

такое чуство что число в памяти вида 123.123123, а пхп нам его преподносит как 123

7094
Dim @Render
Dimitry пишет:

Протестировал диапазон, таких чисел очень много.
Причём очень много таких которые одинаковы визуально но не равны через оператор ==, этот баг ещё хуже)
нужно быть осторожнее с floor, ceil, round, (int)

такое чуство что число в памяти вида 123.123123, а пхп нам его преподносит как 123

Математика же, берёт и отбрасывает лишнее повторяющееся, тольк вот на сколько я помню при отбросе, последняя цифра должна вроде как на 1 увеличиватся.
Жалею что алгебру прогулял всю в своё время.. эх)

20090
Dimitry @Dimitry
да там не математика а именно ошибка в памяти, потому что глюки вообще с разными числами, и совсем не математические ((

8497
Степан @Trilby
В питоне вообще пичальна всё..(
>>> str = 10.20*100
>>> str
1019.9999999999999
>>> str = int(str)
>>> str
1019
>>> import math
>>> math.floor(10.20*100)/100
10.19

1019.9999999999999...orly?

>>> str = 10.30*100
>>> str
1030.0
>>> str = int(str)
>>> str
1030
>>> math.floor(10.30*100)/100
10.3

однако...
>>> str = 10.20*100
>>> round(str)
1020

Поэтому, по возможности гоняю все цифры через round ))

Отредактировано Trilby - 09.02.2011
20090
Dimitry @Dimitry
да, но это ведь идиотизм, програмная математика не соответствует реальности ))

20090
Dimitry @Dimitry
Ответ **********

2349
redsymbzone @redsymbzone
Си (и наверно C++ тоже) не поддаются этому багу, значит ошибка в интерпритаторах xD

Отредактировано redsymbzone - 09.02.2011
8497
Степан @Trilby
redsymbzone пишет:

Си (и наверно C++ тоже) не поддаются этому багу, значит ошибка в интерпритаторах xD

Это все не труЪ-языки 😁

Отредактировано Trilby - 09.02.2011
7094
Dim @Render
Это всё "простейшие" законы математики. Даже компьютеру они не подвластны и ему приходится трудно, в частности с плавающей точкой.
Впринцыпи я так и думал... Просто именно про, то, что памяти не хватает, не догадывался. Пост #9 всё чётко разъяснил. Спасибо, почитал. Интересно :-)