Chia số nguyên và nhận giá trị số nguyên


83

Trong các ngôn ngữ như C hoặc Python, nếu tôi chia một số nguyên cho một số nguyên, tôi sẽ nhận được một số nguyên:

>>> 8/3
2

Nhưng trong PHP, nếu tôi chia một số nguyên cho một số nguyên khác với /, đôi khi tôi nhận được một số float:

php > var_dump(6/3);
int(2)
php > var_dump(8/3);
float(2.6666666666667)

Tôi muốn thực hiện phép chia như trong Python hoặc C, để 8/3 là 2. Làm cách nào để thực hiện điều đó trong PHP?


có thể trùng lặp câu hỏi / 2055469
Nikson Kanti Paul

NẾU bạn làm tròn những điều trên, bạn sẽ nhận được 6, bạn cần 5 hay 6?
Starx,

1
@Starx: có nhiều kiểu làm tròn: en.wikipedia.org/wiki/Rounds#Tie-break . Vì vậy, nếu bạn vòng 5,6 - bạn không biết những gì bạn nhận được (không có quy định cụ thể về cách bạn muốn nó được làm tròn)
zerkms

1
@zerkms, Có thực sự hoạt động giống như ceil()floor()là các chức năng làm tròn khác nhau.
Starx

Câu trả lời:


94

sử dụng round()hàm để nhận giá trị làm tròn số nguyên.

round(8 / 3); // 3

hoặc là

Sử dụng floor()hàm để nhận giá trị số nguyên

floor(8 / 3); // 2

10
Không đồng ý. sàn (-8 / 3) === -3.0 nhưng phải là -2
ByScripts

14
Lưu ý rằng floor()sẽ trả về floatKHÔNG phải là số nguyên, vì vậy bạn có được 2.0và không 2. Truyền kết quả để đảm bảo bạn nhận được một số nguyên:(int)floor(8/3)
Jason

2
@ByScripts -8/3 = -3 là một cách hợp lệ để phép chia số nguyên hoạt động như -8/3 = -2 . Cái trước là "cắt ngắn về phía âm vô cùng", và cái sau là "cắt ngắn về phía 0". Cả hai đều có lợi thế, và các ngôn ngữ khác nhau chọn các hành vi khác nhau. Ví dụ: C cắt ngắn về 0 (cũng như PHP 7 intdiv), trong khi Python cắt giảm về phía âm vô cùng.
Mark Amery

Lưu ý rằng ceil () luôn làm tròn lên.
Ales

70

Trong PHP 7, có hàm intdiv làm chính xác những gì bạn muốn.

Sử dụng:

intdiv(8, 3);

Lợi nhuận 2.


4
Đó thực sự là một bất ngờ lớn, chức năng này chỉ được giới thiệu với PHP 7 :) Ồ, muộn còn hơn không.
Eric Gopak

1
có giải pháp nào như thế này trong php 5.6
Usman Ali Maan

1
Không đơn giản như thế này, không. Trong PHP 5.6, sử dụng câu trả lời chấp nhận :)
Marek Lisý

21

Không có toán tử chia số nguyên trong PHP. 1/2 mang lại giá trị phao 0,5. Giá trị có thể được chuyển thành một số nguyên để làm tròn nó xuống hoặc hàm round () cung cấp khả năng kiểm soát tốt hơn đối với việc làm tròn.


var_dump(25/7);           // float(3.5714285714286)    
var_dump((int) (25/7));   // int(3)   
var_dump(round(25/7));    // float(4)     

Hướng dẫn sử dụng PhP


7

dùng cái này....

intval(1700000 / 300000 )...

điều này trả về giá trị số nguyên.


6
(int)(1700000 / 300000);

sử dụng kiểu đúc.


4
Ồ! Chỉ vì (0,1 + 0,7) == 0,799999 ... thay vì 0,8 :) :) :)
Jesse Chisholm

3
@ luc.chante ví dụ bạn đưa ra xảy ra do lỗi dấu phẩy động. Giá trị chính xác của (0.1 + 0.7) * 107.99999999999999911182158029987476766109466552734375. Hoàn toàn đúng khi một (int)ép kiểu cắt bớt giá trị này thành 7. Khi chia một số nguyên cho một số nguyên khác, như trường hợp của câu hỏi và câu trả lời ở đây, lỗi dấu phẩy động như vậy không thể thay đổi kết quả sau khi cắt bớt.
Mark Amery

Điều này tái tạo hành vi chính xác như mong đợi trong C / C ++ khi thực hiện phép chia số nguyên, vì vậy tôi không thấy vấn đề gì cả.
Alexis Wilke

6

Có một số cách để thực hiện phép chia số nguyên trong PHP. Ngôn ngữ này không có toán tử để chia số nguyên, nhưng có một số tùy chọn để làm tròn thương số dấu phẩy động thành số nguyên:

<?php
$pos = 1;
$neg = -1;
$divisor = 2;

// No rounding (float division)
var_dump($pos / $divisor);          //  0.5 (float)
var_dump($neg / $divisor);          // -0.5 (float)

// Round toward zero (like C integer division)
var_dump((int)($pos / $divisor));   //  0 (int)
var_dump((int)($neg / $divisor));   //  0 (int)

// Round half away from zero
var_dump(round($pos / $divisor));   //  1 (float)
var_dump(round($neg / $divisor));   // -1 (float)

// Round down
var_dump(floor($pos / $divisor));   //  0 (float)
var_dump(floor($neg / $divisor));   // -1 (float)

# And on PHP 7 you can round toward zero with intdiv():
var_dump(intdiv($pos, $divisor));   //  0 (int)
var_dump(intdiv($neg, $divisor));   //  0 (int)  Rounded toward zero

Trên PHP 7, bạn có thể sử dụng intdiv($p, $q)để thực hiện trực tiếp phép chia số nguyên. Điều này tương đương với (int)($p / $q)PHP 5.


5

Bạn có thể sử dụng shortform bằng cách thêm | 0 vào cuối

8/3 | 0


3
-1; đây là sự lạm dụng khó hiểu của toán tử "bitwise or". Phải thừa nhận rằng nó hoạt động (vì toán hạng đối với toán tử theo bit được ép kiểu thành số nguyên, làm tròn giá trị float xuống và hoạt động thực tế của bitwise hoặc với 0 không gây ra thay đổi đối với giá trị số nguyên kết quả), nhưng để một nhà phát triển đọc mã này hiểu tại sao nó hoạt động, họ cần phải biết cả hành vi ép kiểu của các toán tử bitwise của PHP (đó là kiến ​​thức khó hiểu mà 99% nhà phát triển PHP sẽ không có) và rằng một bitwise hoặc bằng 0 để lại giá trị không thay đổi (không được đảm bảo, vì không phải tất cả nhà phát triển web hiểu các hoạt động bit).
Mark Amery,

1
@MarkAmery, thực tế là các nhà phát triển Mos không biết về nó không có nghĩa là nó không hoạt động. Và rõ ràng đó là lý do chính đáng để ủng hộ, vì vậy mọi người sẽ học cách sử dụng nó.
Besi

2
có nó là khó hiểu vì vậy không nên được sử dụng trong mã sản xuất, nhưng nó không làm thay đổi thực tế rằng nó là một giải pháp thú vị cho vấn đề
Tomasz Swider

@TomaszSwider một số người cũng có thể tìm kiếm giải pháp ngắn nhất (đặc biệt là trong một số thử thách mã).
Besi

1
Điều này được sử dụng trong JavaScript mọi lúc. Các lập trình viên nên biết về thủ thuật này ngay bây giờ ...
Alexis Wilke

4

ĐỐI VỚI PHP 7 hãy thử intdiv()Hàm:

Cú pháp: int intdiv($dividend, $divisor)

          <?php           
           $dividend = 19; 
           $divisor = 3;  
           echo intdiv($dividend, $divisor); 
           ?>

Đối với các phiên bản PHP cũ hơn:

         <?php
     // Convert $total_minutes to hours and minutes.

         $total_minutes = 640;
         $minutes = $total_minutes % 60;
         $hours = ($total_minutes - $minutes) / 60;

         echo "Time taken was $hours hours $minutes minutes";
         ?>

Kể từ tháng 8 năm 2019, đây là câu trả lời chính xác duy nhất.
DomQ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.