PHP - Сравнение double со строкой странно? - PullRequest
2 голосов
/ 19 мая 2011

Я вижу странное поведение в php, когда сравниваю double со строкой и надеялся, что кто-нибудь сможет объяснить мне, что происходит.

Если я объявлю $ num = 0.333; а затем проверить $ num == '0,333', это выходит как правда. Если я затем добавлю 1 к $ num и затем вычту 1, то $ num == '0.333' получится как false. Если я затем приведу $ num в качестве строки, сравнение вернется к истине. Почему он это делает?

Вот пример:

<?php
  $num = 0.333;

  //returns 0.333 double Yes
  echo $num, ' ', gettype($num), ' ', $num == '0.333' ? 'Yes' : 'No', '<br />';

  $num += 1;
  $num = $num - 1;

  //returns 0.333 double No
  echo $num, ' ', gettype($num), ' ', $num == '0.333' ? 'Yes' : 'No', '<br />';

  $str = (string)$num;

  //returns 0.333 string Yes
  echo $str, ' ', gettype($str), ' ', $str == '0.333' ? 'Yes' : 'No', '<br />';
?>

Спасибо.

Ответы [ 5 ]

1 голос
/ 19 мая 2011

Вы сравниваете число с плавающей запятой.

http://php.net/manual/en/language.types.float.php говорит:

никогда не сравнивайте числа с плавающей запятой для равенства.

== сравнивает по значению, но «между» типами: один из типов должен быть преобразован, прежде чем его можно будет реально сравнить.И это приведет к сравнению переменных с плавающей точкой.Вот почему после выполнения, казалось бы, сбалансированного действия (+1 и -1) вы получаете разные результаты.

1 голос
/ 19 мая 2011

Для сравнения значения и типа в PHP вам нужно использовать 3 "=".например:

$num = 333
$num === 333 => true
$num === '333' => false

Подробнее см. здесь http://php.net/manual/en/language.operators.comparison.php

Возможный способ сравнить Float - использовать метод, указанный в комментариях php.net относительно float:

<?php 
$number1=number_format($float1,2,'.',''); 
$number2=number_format($float2,2,'.'''); 
if($number1!=$number2){ 
 echo 'do correction here!'; 
} 
?>

Но, видимо, нет определенного, лучшего способа сделать это (или я не нашел его).Некоторые конвертируют число с плавающей точкой в ​​String, другие делают код, который я только что написал.

Как вам нравится;)

0 голосов
/ 24 апреля 2015

Для сравнения два числа с плавающей запятой или двойное использование http://php.net/manual/en/function.bccomp.php

0 голосов
/ 19 мая 2011

Вы сравниваете число с плавающей запятой, для которого последние цифры являются проблемой.

Один вариант, который вы можете сделать, это преобразовать число с плавающей точкой в ​​строку и взять первые x символов (т. Е. Если у вас есть строка «.333», с которой вы сравниваете ее, преобразуйте число с плавающей точкой в ​​строку и возьмите первое или четыре символа), или вы можете сравнить число с плавающей запятой с соответствующими десятичными знаками, прежде чем сравнивать его.

0 голосов
/ 19 мая 2011

Точка отсчета: используйте === вместо ==, чтобы избежать приведения типов.

Причина в том, что в первом случае $ num является двойным, но он также равен строке '0.333'.

Использование === показывает, что двойное значение 0,333 не совпадает со строкой «0,333».

Второй сделал некоторые дополнения, теперь double больше не равен 0.333, так что это не то же самое, что строка с погрешностями с плавающей запятой.

Третий бросил 0.333 в строку, что, конечно, совпадает со строкой.

...