> Теперь вопрос на засыпку: почему, если я в PHP вычисляю 1.2 - 1.0 получаю 0.2?
А Вы уверены что получаете 0.2? :-) Вы от процессора на самом деле получаете в одном случае 0.19999999999999996, а в другом 0.20000000000000001 и об этом даже не подозреваете. :-) Просто PHP это для Вас округляет чтобы Вас это не пугало. Потому что PHP как и его праотец Perl -- нетипизированные язык. Там вместо типов -- скаляры. Если очень грубо говорить: "все на строках":
Но вот Python имеет типы и очень точен с плавающей точкой, и конфузов не будет, в то время Вы никак не можете понять почему в PHP 1.2 - 1.0 != 0.2 :-)
Вот смотрите:
>>> a = 0.2
>>> b = 1.2 - 1.0
>>> assert a == b
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError
>>> a == b
False
А ведь все просто:
>>> a
0.20000000000000001
>>> b
0.19999999999999996
Но в Perl и PHP вы не поймете в чем проблема:
shourisha@gandalph:(~) cat test.pl
#!/usr/bin/perl
$a = 0.2;
$b = 1.2 - 1.0;
if ($a == $b) {
print "Equal\n";
} else {
print "Not equal\n";
}
shourisha@gandalph:(~) perl test.pl
Not equal
Или в Ruby:
irb(main):001:0> a = 0.2
=> 0.2
irb(main):002:0> b = 1.2 - 1.0
=> 0.2
irb(main):003:0> a == b
=> false
Или в Scheme/LISP:
1 ]=> (define a 0.2)
;Value: a
1 ]=> (define b (- 1.2 1.0))
;Value: b
1 ]=> a
;Value: .2
1 ]=> b
;Value: .19999999999999996
ГДЕ!!! ГДЕ БАГ!!! :)))))
|