Hướng dẫn dùng intergs trong PHP

PHP cung cấp hai loại dữ liệu cơ bản: số nguyên (integer) và số thực dấu phảy động (float/double). Đây là hai trong số bốn kiểu dữ liệu đơn, bao gồm số nguyên, số thực, logic (boolean) và chuỗi (string).

Nội dung chính

  • Kiểu số nguyên integer/int trong PHP
  • Chuyển đổi dữ liệu về kiểu số nguyên
  • Kiểu số thực float/double trong PHP
  • Các phép toán trên kiểu số
  • Phép toán số học
  • Các phép gán
  • Các phép tăng giảm
  • Các phép so sánh
  • Kết luận

Kiểu số nguyên integer/int trong PHP

Integer là kiểu dữ liệu biểu diễn các số nguyên trong PHP.

Dải giá trị của integer phụ thuộc số bit của hệ điều hành. Trên các hệ điều hành 32 bit, số nguyên integer được biểu diễn bởi 32 bit, do đó có dải giá trị từ -2^31 (-2 147 483 648) đến +2^31 – 1 (2 147 483 647).

PHP chấp nhận giá trị số nguyên viết ở hệ 10 (mặc định), hệ 2, hệ 8 và hệ 16.

Số nguyên ở hệ cơ số 2 được viết với tiền tố 0b (hoặc 0B) và -0b/-0B (với số âm). Ví dụ:

php > $bin = 0b1100; php > echo $bin; 12 php > $bin = 0B0011; php > echo $bin; 3 php >

Số nguyên ở hệ cơ số 8 được viết với tiền tố 0 – số không (hoặc -0 nếu là số âm). Ví dụ:

php > $oct = 0755; php > echo $oct; 493 php > $oct = +010; php > echo $oct; 8 php >

Số nguyên ở hệ cơ số 16 được viết với tiền tố 0x hoặc 0X (-0x, -0X với số âm). Ví dụ:

php > $hex = 0xff; php > echo $hex; 255 php > $hex = -0xdad; php > echo $hex; -3501 php > $hex = 0X11FF; php > echo $hex; 4607 php >

Để kiểm tra giá trị một biến đang chứa có thuộc kiểu số nguyên hay không có thể sử dụng hàm is_int() hoặc is_integer():

php > $i = 100; php > echo is_int($i); 1 php > echo is_integer($i); 1 php > $i = "100"; php > echo is_int($i); // kết quả là chuỗi rỗng -> false php >

Bạn cũng có thể sử dụng hàm gettype() để lấy tên kiểu giá trị của biến. Nếu biến chứa số nguyên, kết quả trả về sẽ là chuỗi “integer“.

php > $i = 100; php > gettype($i); php > echo gettype($i); integer

Kiểu số nguyên trong PHP có hai tên gọi: integer int. Mặc dù chúng là một nhưng được sử dụng trong các hoàn cảnh khác nhau:

  • Tên gọi integer được sử dụng trong kết quả của hàm kiểm tra kiểu gettype().
  • Tên gọi int được sử dụng làm chỉ báo kiểu trong khai báo hàm (trong PHP 7). Hàm sẽ được xem xét chi tiết ở một bài học riêng.
  • Trong phép toán chuyển đổi kiểu có thể sử dụng cả (integer)(int). Xem chi tiết ở phần sau của bài học này.

Chuyển đổi dữ liệu về kiểu số nguyên

PHP cho phép chuyển đổi dữ liệu từ kiểu chuỗi và logic về số nguyên. Để chuyển đổi, bạn sử dụng phép toán chuyển đổi kiểu (int) hoặc (integer) trước giá trị/biến cần chuyển và gán kết quả cho một biến khác.

Quy tắc chuyển đổi như sau:

  • Giá trị false -> 0.
  • Giá trị true -> 1.
  • Nếu chuỗi chứa toàn chữ số -> chuyển thành giá trị ở cơ số 10.
  • Nếu chuỗi bắt đầu bằng chữ số -> trích phần chữ số để chuyển thành số ở cơ số 10.
  • Các loại chuỗi khác -> giá trị 0.

Hãy xem các ví dụ sau:

php > $i = 100; php > gettype($i); php > echo gettype($i); integer php > $i = (int) "1000"; // chuyển đổi kiểu string -> int php > echo gettype($i); integer php > $i = (integer) "10000"; // chuyển đổi kiểu string -> integer php > echo gettype($i); integer php > $i_str = "100a"; // chuỗi này chuyển được thành số nguyên php > $i = (int)$i_str; // phép chuyển đổi này cho kết quả 100 php > echo $i; 100 php > $i_str = "a100"; // chuỗi này không chuyển được php > $i = (int)$i_str; // phép chuyển đổi này cho kết quả 0 php > echo $i; 0 php > $i = (int) true; // chuyển đổi kiểu bool -> int php > echo gettype($i); integer php > echo $i; 1 php > $i = (int) false; php > echo $i; 0 php >

Một cách khác để chuyển đổi giá trị về số nguyên là sử dụng hàm intval().

Hãy xem ví dụ sau:

php > $dec_str = '1234'; php > $dec = intval($dec_str); // chuyển chuỗi '1234' về số nguyên hệ 10 (mặc định) php > echo gettype($dec); integer php > echo $dec; 1234 php > $hex_str = "ff"; php > $hex = intval($hex_str, 16); // chuyển chuỗi "ff" hệ 16 về số nguyên hệ 10, thu được giá trị 255 php > echo $hex; 255 php > $bin_str = '10000000'; php > $bin = intval($bin_str, 2); // chuyển chuỗi '10000000' hệ 2 về số nguyên hệ 10, thu được 128 php > echo $bin; 128 php >

Sự khác biệt giữa chuyển đổi kiểu (int) và intval() nằm ở chỗ, intval có thể chấp nhận chuỗi biểu diễn số ở những hệ cơ số khác, trong khi (int) chỉ hiểu những chuỗi biểu diễn số ở hệ 10. Về hiệu suất thì (int) nhanh hơn intval().

Hai phương pháp trên cũng được dùng để chủ động chuyển đổi từ giá trị số thực về số nguyên.

Kiểu số thực float/double trong PHP

Float hay double là tên của kiểu dữ liệu biểu diễn các số thực dấu phẩy động trong PHP.

PHP cho phép viết số thực ở một trong hai dạng:

  • Dạng thông thường: 1.23456, +1.23456, -1.23456. Lưu ý sử dụng dấu chấm để phân tách phần thập phân.
  • Dạng khoa học: 1.234e2, 1.234e+2, 1234e-2, 1.234E2, -1234E2. Có thể viết e hoặc E đều được, trong đó En tương đương với *10^n. Ví dụ, 1.234e2 = 1.234 * 10^2 = 123.4
php > $d1 = 1.234; php > $d2 = -1.23456; php > $d3 = -1.23456; php > $d4 = 1.234e2; php > echo $d4; 123.4 php > $d5 = 1234e-2; php > echo $d5; 12.34 php >

Để kiểm tra một giá trị có thuộc kiểu số thực hay không, bạn có thể sử dụng hàm is_float() hoặc is_double().

Khi sử dụng hàm gettype() trên biến kiểu số thực sẽ thu được kết quả là ‘double‘.

Tương tự, bạn có thể chuyển đổi kiểu từ các kiểu dữ liệu khác (string, int) về kiểu số thực qua phép chuyển đổi kiểu (float) hoặc (double) hoặc qua hàm floatval()/doubleval().

Kiểu số thực trong PHP cũng có hai tên gọi: float double. Trong các phiên bản PHP trước 7.4 bạn còn gặp tên gọi real.

Giống trường hợp số nguyên, tên các kiểu số thực được sử dụng trong những hoàn cảnh khác nhau:

  • Tên gọi double được sử dụng trong kết quả của hàm kiểm tra kiểu gettype().
  • Tên gọi float được sử dụng làm chỉ báo kiểu trong khai báo hàm.
  • Cả hai tên gọi đều có thể sử dụng trong phép toán chuyển đổi kiểu (float)(double). Trong PHP 7.4 cách viết (real) mặc dù vẫn đúng nhưng bị đánh dấu deprecated cast.

Các phép toán trên kiểu số

Phép toán số học

Cả số nguyên và số thực trong PHP đều có chung một số phép toán số học:

Giả sử có hai biến $a = 10; $b = 3;

Ký hiệuPhép toánVí dụ
+ Phép cộng $a + $b // = 13
Phép trừ $a – $b // = 7
* Phép nhân $a * $b // = 30
/ Phép chia $a / $b // = 3.3333
% Phép chia lấy dư $a % $b // = 1
** Phép lũy thừa $a ** $b // = 1000
Đảo dấu -$a // = -10

Lưu ý:

  • Phép toán giữa số thực và số nguyên luôn cho kết quả là số thực. Ví dụ, kết quả của phép toán 1 + 1.0 thuộc kiểu double.
  • Phép toán giữa hai số thực luôn cho kết quả là số thực.
  • Nếu phép chia hết giữa hai số nguyên thì kết quả là số nguyên. Trong các trường hợp khác kết quả của phép chia là số thực.

Các phép gán

Giống như các ngôn ngữ họ C, PHP cũng cung cấp các phép gán +=, -=, *=, /=:

Ký hiệuPhép toánVí dụ
+= Cộng gán $a += 5 // tương đương $a = $a + 5
-= Trừ gán $a -= 5 // tương đương $a = $a – 5
*= Nhân gán $a *= 5 // tương đương $a = $a * 5
/= Chia gán $a /= 5 // tương đương $a = $a / 5
**= Lũy thừa gán $a **= 5 // tương đương $a = $a ** 5

Các phép tăng giảm

Giống như C, trong PHP bạn cũng có thể thực hiện các phép toán tăng giảm ++ và –:

Phép toán tăng ++ có hai dạng: tăng trước ++$a và tăng sau $a++.

Cả hai phép toán tăng này đều cộng thêm một đơn vị vào $a. Sự khác biệt nằm ở chỗ:

  • ++$a sẽ thực hiện cộng thêm 1 vào $a rồi trả lại kết quả;
  • $a++ sẽ trả lại $a trước rồi mới thực hiện phép cộng thêm 1.
php > $a = 1; php > echo ++$a; // thực hiện phép cộng thêm 1 vào $a và trả lại $a (mới) 2 php > $a = 1; php > echo $a++; // trả lại giá trị của $a (cũ) trước rồi mới cộng thêm 1 vào $a 1 php > echo $a; // giờ $a mới có kết quả mới 2

Phép toán giảm — cũng tương tự, bao gồm giảm trước –$a và giảm sau $a–. Khác biệt là nó giảm giá trị của biến đi 1 đơn vị.

Các phép so sánh

Bạn có thể so sánh các giá trị số sử dụng các phép toán so sánh như sau:

Phép toánÝ nghĩaVí dụ
< Nhỏ hơn 2 < 3 // true
<= Nhỏ hơn hoặc bằng 3 <= 3 // true
> Lớn hơn 2 > 3 // false
>= Lớn hơn hoặc bằng 3 >= 3 // true
== So sánh bằng 3 == 3 // true
!= So sánh khác 2 != 3 // true
<> So sánh khác 2 <> 3 // true
<=> Phép so sánh spaceship 1 <=> 2 // -1
3 <=> 2 // +1
1 <=> 1 // 0

Có thể để ý PHP có hai phép toán so sánh khác != và <>. Hai phép toán này không có gì khác biệt nhau.

Phép so sánh spaceship không trả lại kết quả logic true/false mà trả về kết quả số nguyên: -1 nếu vế trái nhỏ hơn; +1 nếu vế trái lớn hơn; 0 nếu hai vế bằng nhau.

Một điều lưu ý nữa là các phép so sánh bằng và khác trong PHP có thể áp dụng với hai vế thuộc hai kiểu khác nhau! Ví dụ, có thể so sánh chuỗi với số! Ngoài các phép so sánh trên trong PHP còn có các phép toán so sánh tương tự ===, !==.

Chúng ta sẽ xem xét kỹ hơn về các phép toán so sánh trong bài học về kiểu boolean.

Bạn không nên trực tiếp so sánh == giữa hai số thực do biểu diễn số thực trong máy tính chỉ là gần đúng.
Để so sánh, bạn chuyển nó về số nguyên với cùng độ chính xách mong muốn rồi thực hiện phép so sánh ==.
Ví dụ, so sánh $a = 1.0102 với $b = 1.010201, bạn nên làm như sau:
$aa = (int) ($a * 10000); // lấy chính xác đến phần vạn, cho kết quả 10102
$bb = (int) ($b * 10000); // cùng lấy độ chính xác như a, cho kết quả 10102
Giờ có thể so sánh $aa và $bb, thay cho so sánh trực tiếp $a và $b.

Kết luận

Trong bài học này chúng ta đã xem xét chi tiết về kiểu số nguyên và kiểu số thực trong PHP.

  • Nhìn chung các kiểu số trong PHP khá tương đồng với các kiểu số trong các ngôn ngữ họ C khác.
  • Số nguyên hỗ trợ lối viết của các hệ cơ số 10, 2, 8 và 16.
  • Số thực hỗ trợ lối viết thông thường và lối viết khoa học.
  • Có thể chuyển đổi từ các kiểu dữ liệu khác (như bool và string) về kiểu số nguyên hoặc số thực qua các phép toán ép kiểu (int), (integer), (float), (double).
  • Có thể kiểm tra kiểu của biến qua các hàm is_int(), is_integer(), is_float(), is_double(), hoặc qua hàm gettype().
  • Các kiểu số trong PHP hỗ trợ các phép toán số học, gán, tăng giảm, so sánh.

+ Nếu bạn thấy site hữu ích, trước khi rời đi hãy giúp đỡ site bằng một hành động nhỏ để site có thể phát triển và phục vụ bạn tốt hơn.
+ Nếu bạn thấy bài viết hữu ích, hãy giúp chia sẻ tới mọi người.
+ Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần thảo luận cuối trang.
Cảm ơn bạn!