Преобразование int в число с плавающей запятой, два десятичных значения в PHP

Возможный дубликат:
PHP: показать число с точностью до 2 знаков после запятой

Как преобразовать целое число, скажем $i=50, в число с плавающей запятой с двумя десятичными значениями: $m=50.00? Я пробовал (float)$i, но ничего не вышло.

РЕДАКТИРОВАТЬ:

Мне нужно сделать $i == $m, чтобы возвращалось TRUE;


person menislici    schedule 20.10.2012    source источник


Ответы (3)


Если вы просто используете обычный оператор равенства (==) вместо типобезопасного оператора равенства (===), у вас не должно возникнуть никаких проблем.

Сравнение double с int с теми же значениями:

$i = 20;
$m = 20.00;

gettype($i); // integer
gettype($m); // double

$i == $m; // true;
$i === $m; // false, $m is a double and $i is an integer.

Однако, если мы хотим это исправить, нам просто нужно сделать:

$i = (double)$i;
gettype($i); // double
$i === $m; // true!
person nyson    schedule 21.10.2012
comment
+1 к типу .. но по-прежнему не возвращает 50.00 как float .... см. codepad.viper- 7.com/CCAoaW ... - person Baba; 21.10.2012
comment
Почему интерес к печати var_dump()? Это всего лишь отладочный обмен сообщениями, он должен распечатать значение самым простым способом. OP интересовался, как сделать число с плавающей запятой (float и double в php одинаковы (объяснил)) быть целым числом. (float)$i и (double)$i оба возвращают числа с плавающей запятой в var_dump() и удваивают в gettype(). - person nyson; 21.10.2012
comment
Первоначальный вопрос заключался в том, как напечатать float без десятичной части, чтобы он показывал там нули. Затем автор изменил вопрос. И этот Баба не понимает, что такое типы данных и как они работают в PHP. - person clentfort; 21.10.2012
comment
Тогда кастинг на самом деле не имеет отношения к вопросу. Если я не ошибаюсь, ни number_format (), ни sprintf () не заботятся о типе аргументов, если это число. - person nyson; 21.10.2012

round((float)$i, 2) Должен сделать свое дело.

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

Ах да, number_format($var, 2) тоже хорошо!

person davepmiller    schedule 20.10.2012
comment
number_format и sprintf оба лучше, чем это решение. - person clentfort; 21.10.2012
comment
@clenfort, почему ты так думаешь? - person menislici; 21.10.2012
comment
number_format возвращает строку не с плавающей точкой .... - person Baba; 21.10.2012
comment
Я не согласен: codepad.viper-7.com/Va7w4j - person Bailey Parker; 21.10.2012

Для чисел с плавающей запятой количество десятичных цифр является свойством форматирования, то есть само число не знает об этих вещах. float 50 сохраняется как точное целое число 50. Вам необходимо отформатировать число (например, с помощью sprintf), чтобы оно было записано с помощью десятичных цифр.

person Joey    schedule 20.10.2012
comment
если $i=50 хранится как $m=50.00, то $i==$m вернет TRUE. Однако в моем приложении это не так, оно возвращает FALSE. - person menislici; 21.10.2012
comment
Это не. Но числа с плавающей запятой, которые содержат целые числа, могут точно представлять эти числа. Прочтите, как они выглядят в памяти, и вы заметите то же самое. Десятичные числа, такие как, например, .NET, также сохраняют свою точность, поэтому вы можете иметь десятичное число с точностью до 2 цифр. Но не нормальный float. - person Joey; 21.10.2012
comment
$i==$m возвращает true. $i===$m возвращает false, поскольку оператор === также сравнивает типы данных, которыми в вашем случае являются int и float, а == автоматически преобразует int в float для сравнения. Фактическая переменная не будет затронута. - person clentfort; 21.10.2012
comment
Uhm, of course it's a valid floating-point number ??? скажите мне, как php будет показывать 50.00 как float ... - person Baba; 21.10.2012
comment
@Joey В следующий раз изучите PHP подробнее ... нет способа получить 50.00 как float, все, что вы получите, это 50 в php. Вы можете получить только строку - person Baba; 21.10.2012
comment
@ Баба Джоуи провел свое исследование. Прочтите его ответ внимательнее. en.wikipedia.org/wiki/Floating_point Число 50.00 и 50 представлены как 5 * 10^1. - person Bailey Parker; 21.10.2012
comment
@PhpMyCoder да ... я знаю, что говорит википедия ... но в PHP нет способа представить это таким образом ... даже если у вас $a = 50.00 PHP автоматически конвертирует его в 50 ... Было бы неплохо для вас чтобы провести тест ... протестировано в 10 different php version sandbox.onlinephpfunctions.com/code/ .. вы были бы удивлены .. а то, что было сказано - person Baba; 21.10.2012
comment
@Baba PHP ничего не конвертирует автоматически. codepad.viper-7.com/eAGKYJ При var_dump(50.00) отображается эхо float(50). Число не конвертируется; это все еще поплавок. Но компьютер представляет 50,00 в своей памяти как 50 * 10^1. Это не имеет ничего общего с PHP, потому что то же самое происходит в C: codepad.org/VxR89E1d - person Bailey Parker; 21.10.2012
comment
@PhpMyCoder Вы забыли return 0 в вашем коде C. ;) И прекратите спорить с тем бабой, прочтите его ответ. Я пытался объяснить ему разницу между типом данных и тем, как что-то печатается для пользователя, он не хочет понимать. Также он не знает разницы между int и float. Это борьба с ветряными мельницами. - person clentfort; 21.10.2012
comment
@clentfort все, что я просил, это показать мне 50.00 как float в PHP, а вы сказали: «узнать, что на самом деле делает ===, что делает var_dump» ??? === в PHP используется для сравнения типов TRUE, если $ a равно $ b, и они одного типа. ... я ни с кем здесь не ссорюсь ... просто хочу опереться ... по крайней мере, для меня тестовый пример, который доказывает обратное ... никто этого не сделал - person Baba; 21.10.2012
comment
@Baba: Присоединяйтесь к чату, я предлагаю вам в вашем ответе, я пытаюсь объяснить - person clentfort; 21.10.2012
comment
@PhpMyCoder благодарит за ответ. Ctypes и PHP немного разнятся. PHP по-прежнему говорит 50.00 is not 50 ... У вас есть способ доказать это без использования ==, потому что он возвращает TRUE if $a is equal to $b after type juggling.. Единственный способ проверить переменные с их типом в PHP - ===. Я не уверен в другом способе - person Baba; 21.10.2012
comment
@clentfort где ссылка на график - person Baba; 21.10.2012
comment
chat.stackoverflow.com/rooms/18352/ - person clentfort; 21.10.2012