Возможный дубликат:
Точность вычисления PHP float
когда я выполнил код ниже в eclipse, результат был не 0, а 5.5511151231258E-17
$a = 0.1+0.2-0.3; echo $a;
может кто-нибудь сказать мне, почему?
Это связано с тем, что числа с плавающей запятой имеют ограниченную точность .
Более подробную информацию об этом признаке можно найти на этой странице в руководстве по PHP .
Числа с плавающей запятой имеют ограниченную точность. Хотя это зависит от системы, PHP обычно использует формат двойной точности IEEE 754, который даст максимальную относительную ошибку из-за округления порядка 1.11e-16. Неэлементарные арифметические операции могут приводить к большим ошибкам, и, конечно же, необходимо прообразить ошибку, когда несколько операций усугубляются.
Кроме того, рациональные числа, которые точно представлены в виде чисел с плавающей запятой в базе 10, например 0,1 или 0,7, не имеют точного представления в виде чисел с плавающей запятой в базе 2, которые используются внутри, независимо от размера мантиссы. Следовательно, они не могут быть преобразованы в их внутренние двоичные копии без небольшой потери точности. Это может привести к запутывающим результатам: например, пол ((0,1 + 0,7) * 10) обычно возвращает 7 вместо ожидаемого 8, так как внутреннее представление будет чем-то вроде 7.9999999999999991118 ….
Поэтому никогда не доверяйте действию чисел с плавающим числом до последней цифры и никогда не сравнивайте числа с плавающей запятой для равенства. Если требуется более высокая точность, доступны произвольные математические функции точности и функции gmp.
Обратите внимание, что это не является особенностью, характерной для PHP; это как раз то, как работают числа с плавающей запятой .
Вы сталкиваетесь с проблемами точности с плавающей запятой PHP. Все языки имеют их, вы только что нашли PHP.
Это не относится к PHP, как говорили другие. Однако вы можете избежать ограниченной точности с плавающей запятой, используя round ():
<?php $a = 0.1+0.3-0.2; echo round($a, 2); ?>
Конечно, вам нужно знать количество цифр заранее.
Это потому, что компьютеры не могут точно представлять числа с плавающей запятой. Это не относится к PHP.
Подробнее см. Здесь .