Это арифметика от PHP иль я чёт не понимаю?

AlexOr

Guest
Это арифметика от PHP иль я чёт не понимаю?

Объясните, плиз, в чём загвоздка:

PHP:
$var1 = 4.9 - 5;
$var2 = 0.1;

echo "var1 = ".$var1."<br>";
echo "var2 = ".$var2."<br>";
echo "abs(var1) = ".abs($var1)."<br><br>";


if (abs($var1) > $var2) {
	echo "abs(\$var1) > \$var2";
} elseif(abs($var1) < $var2) {
	echo "abs(\$var1) < \$var2";
} elseif(abs($var1) == $var2) {
	echo "abs(\$var1) == \$var2";
}
Выводится подстрока "abs(\$var1) < \$var2"
Пробую на PHP 4.3.10

Грешил на типы переменных, но дело вроде как не в этом.
Заранее спасибо.
 

SiMM

Новичок
Да чему вас в школе учат? Сравнение производится вычитанием, посему смотри на свои грабли при помощи
PHP:
var_dump($var2-abs($var1));
и всё сразу встанет на свои места.
PS: и не надо приплетать сюда PHP - он не виноват, что ты не знаешь азов машинной арифметики.
 

AlexOr

Guest
хмм.. вопрос даже можно упростить:

PHP:
$var1 = 5.0 - 4.9;
$var2 = 0.1;

echo "var1 = ".$var1."<br>";
echo "var2 = ".$var2."<br><br>";

echo "gettype(var1) = ".gettype($var1)."<br>";
echo "gettype(var2) = ".gettype($var2)."<br><br>";


if ($var1 > $var2) {
	echo "\$var1 > \$var2";
} elseif($var1 < $var2) {
	echo "\$var1 < \$var2";
} elseif($var1 == $var2) {
	echo "\$var1 == \$var2";
}
-~{}~ 20.01.05 17:10:

Уважаемый SiMM, а не богли бы Вы вкратце объяснить сие явление

PHP:
$var1 = 5.0 - 4.9;
$var2 = 0.1;
var_dump($var1, $var2, ($var1-$var2));
или дать ссылку где найдётся это объяснение
 

WeirD

Новичок
PHP:
$var1 = 5.0 - 4.9;
$var2 = 0.1;

var_dump($var1);
var_dump($var2);

var_dump($var2-$var1);
Результат сего действа таков:

float(0.1)
float(0.1)
float(3.6082248300318E-16)

Если честно, не вижу ошибки (кроме результата)...

А вот, что говорит мануал:
Довольно часто простые десятичные дроби вроде 0.1 или 0.7 не могут быть преобразованы в свои внутренние двоичные аналоги без небольшой потери точности. Это может привести к неожиданным результатам: например, floor((0.1+0.7)*10) скорее всего возвратит 7 вместо ожидаемой 8 как результат внутреннего представления числа, являющегося в действительности чем-то вроде 7.9999999999....
Это связано с невозможностью точно выразить некоторые дроби в десятичной системе счисления конечным числом цифр. Например, 1/3 в десятичной форме принимает вид 0.3333333. . ..
 

SiMM

Новичок
Автор оригинала: WeirD
А вот, что говорит мануал:
Это связано с невозможностью точно выразить некоторые дроби в десятичной системе счисления конечным числом цифр. Например, 1/3 в десятичной форме принимает вид 0.3333333. . ..
Надо заметить, мануал немножко опускает детали, поскольку конечная в десятичной системе дробь 0.1 в двоичной системе счисления так же не выражается конечной дробью - 0.0(0011)
 
Сверху