Різниця між float і double в php?


117

У мене цей код

$vad = 1.1;

print gettype($vad);

var_dump($vad);

це виведе:

double
float(1.1) 

Так це подвійне або плаваюче в php?

Відповіді:


151

Різниці в PHP немає. float, doubleАбо realтакі ж тип даних.

На рівні С все зберігається як double.
Реальний розмір все ще залежить від платформи.

Детальну інформацію див. У посібнику:
http://www.php.net/manual/en/language.types.float.php


впевнені в цьому? Чи є в цьому деяке використання пам'яті?
TheCrazyProfessor

2
У мене є функція function some( float $num){}, коли я використовую some(17.23)її, видає фатальну помилку, деякі () повинні бути екземпляром float, подвійним даним,
NaveenDA

1
@NaveenDA Яка версія PHP? До PHP 7.0, підказки скалярного типу були недоступні, і їх слід інтерпретувати як імена класів. Це схоже на те, що там відбувається.
Кен Уейн ВандерЛінде

просто уточнивши, що realв PHP поки немає такого типу даних .
Мухаммед

@MuhammadSheraz Але є is_realфункція, з псевдонімом is_float...; )
Макмаде

21

Для PHP вони однакові. http://www.php.net/manual/en/language.types.float.php :

Числа з плаваючою комою (також відомі як "плаваючі", "подвійні" або "реальні числа") можна вказати, використовуючи будь-який із наступних синтаксисів: [...]

Конфузна частина, чому gettype (який у будь-якому разі не слід використовувати) повертає "подвійний" замість "плавати". Відповідь http://de2.php.net/manual/en/function.gettype.php :

"подвійний" (з історичних причин "подвійний" повертається у випадку поплавця, а не просто "плавати")


10

Станом на PHP 7.0.6 для Windows, порівнюючи цю команду без xdebug:

$ php -r 'var_dump(28.4);'
float(28.4)

та з xdebug:

$ php -r 'var_dump(28.4);'
Command line code:1:
double(28.4)

Зауважте, що це змінює лише var_dump () вихід, але не власне управління пам'яттю.

Це може вирішити деякі проблеми, чому ви бачите doubleзамість floatпоказаних у var_dump на інших машинах.

Також з xdebug або без нього gettypeвсе одно повертається string(6) "double".


4

У PHP 7.0.14

function test(double $a) {
    var_dump($a);
}
test(2.2111);

Повертає "Фатальна помилка: Uncaught TypeError: Аргумент 1, переданий для тестування (), повинен бути екземпляром даного подвійного плавання"

function test(float $a) {
    var_dump($a);
}
test(2.2111);

Друкує 2.2111 на екран.


8
Лише floatє дійсна підказка типу ( див. ). Коли ви набираєте doubleнатомість, він трактується як ім'я класу, а інтерпретатор викидає виняток, оскільки він очікує змінну з екземпляром doubleкласу
AterLux
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.