|
|
|
| Есть переменная $size:
var_dump($size); дает float(-1)
Делаю сравнение на $size == (float)-1 и получаю false
|
Почему? | |
|
|
|
|
|
|
|
для: OLi
(03.01.2013 в 20:23)
| | Этой проблеме сто лет в обед. Дело в том, что float - это не число, а модель числа. Лично я, сам не до конца понимаю как это реализуется на уровне ядра =) но знаю, что даже (float)0 != нулю. При работе с float в надцатом знаке после запятой появляется погрешность, поэтому и не равно. И об этом нужно всегда помнить при работе с данными с плавающей точкой в любом языке программирования и в любом диалекте баз данных и вообще везде. Для получения точного результата используйте round(), округляя float до нужного знака после запятой. | |
|
|
|
|
|
|
|
для: Sfinks
(03.01.2013 в 21:35)
| | Думал об округлении. Проблема в том что функция у меня возвращает либо 1 либо -1 | |
|
|
|
|
|
|
|
для: OLi
(04.01.2013 в 00:23)
| | И какая связь с float? | |
|
|
|
|
|
|
|
для: Sfinks
(03.01.2013 в 21:35)
| | >Лично я, сам не до конца понимаю как это реализуется на уровне ядра =) но знаю, что даже
>(float)0 != нулю.
Тут даже не на уровне ядра, а на уровне двоичной системы. Сколько бы байт не отводилось под число с плавающей точкой, количество нулей и единиц будет конечным, а для представления чисел вроде 1/3 нужна бесконечная мантисса (и таких чисел на самом деле довольно много и получаются они автоматически в результате деления и умножения). Т.е. ряд чисел сразу хранятся с ошибкой, а ряд ошибок образуется в результате деления и умножения. Сделать ничего практически нельзя на текущей архитектуре, только хранить числа в строках. | |
|
|
|