ความแตกต่างระหว่าง float และ double ใน php?


118

ฉันมีรหัสนี้

$vad = 1.1;

print gettype($vad);

var_dump($vad);

สิ่งนี้จะส่งออก:

double
float(1.1) 

ดังนั้นมันจึงเป็น double หรือ float ใน php?

คำตอบ:


153

ไม่มีความแตกต่างใน PHP float, doubleหรือrealเป็นประเภทข้อมูลเดียวกัน

ที่ระดับ C ทุกอย่างจะถูกจัดเก็บเป็นไฟล์double.
ขนาดจริงยังขึ้นอยู่กับแพลตฟอร์ม

ดูคู่มือสำหรับรายละเอียดเพิ่มเติม:
http://www.php.net/manual/en/language.types.float.php


แน่ใจเหรอ? มีการใช้หน่วยความจำแตกต่างกันหรือไม่?
TheCrazyProfessor

2
ฉันมีฟังก์ชั่นfunction some( float $num){}เมื่อฉันใช้some(17.23)มันจะทำให้เกิดข้อผิดพลาดร้ายแรงบางอย่าง () ต้องเป็นอินสแตนซ์ของการลอยตัวให้สองครั้ง
NaveenDA

1
@NaveenDA PHP เวอร์ชั่นอะไร? ก่อนหน้า PHP 7.0 ไม่มีคำแนะนำประเภทสเกลาร์และจะตีความเป็นชื่อคลาสแทน ดูเหมือนว่าจะเกิดอะไรขึ้นที่นั่น
Ken Wayne VanderLinde

เพียงแค่ชี้แจงว่ายังไม่มีประเภทข้อมูลrealใน php
Muhammad Sheraz

@MuhammadSheraz แต่มีis_realหน้าที่ด้วยคือนามแฝงของis_float... ; )
Macmade

21

สำหรับ PHP ก็เหมือนกัน http://www.php.net/manual/en/language.types.float.php :

ตัวเลขทศนิยม (หรือที่เรียกว่า "ลอย" "คู่" หรือ "จำนวนจริง") สามารถระบุได้โดยใช้ไวยากรณ์ต่อไปนี้: [... ]

ส่วนที่ทำให้สับสนคือทำไม gettype (ซึ่งคุณไม่ควรใช้อยู่ดี) ส่งคืน "double" แทน "float" คำตอบคือhttp://de2.php.net/manual/en/function.gettype.php :

"double" (สำหรับเหตุผลทางประวัติศาสตร์ "double" จะถูกส่งกลับในกรณีของ float ไม่ใช่แค่ "float")


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, ยังคงส่งกลับgettypestring(6) "double"


4

ใน PHP 7.0.14

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

ส่งคืน "ข้อผิดพลาดร้ายแรง: Uncaught TypeError: อาร์กิวเมนต์ 1 ที่ส่งไปยังการทดสอบ () ต้องเป็นอินสแตนซ์ของ double, float given"

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

พิมพ์ 2.2111 ไปที่หน้าจอ


8
floatคำใบ้ประเภทที่ถูกต้องเท่านั้น( ดู ) เมื่อคุณพิมพ์doubleแทนจะถือว่าเป็นชื่อคลาสและล่ามจะโยนข้อยกเว้นเนื่องจากคาดว่าจะมีตัวแปรที่มีอินสแตนซ์ของdoubleคลาส
AterLux
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.