除整数并获得整数值


83

在C或Python之类的语言中,如果将整数除以整数,则会得到一个整数:

>>> 8/3
2

但是在PHP中,如果我使用将一个整数除以另一个整数/,有时会得到一个浮点数:

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

我想像Python或C这样进行除法,所以8/3是2。如何在PHP中做到这一点?



如果您按照上述方法四舍五入,您将得到6,您需要5还是6?
Starx 2012年

1
@Starx:舍入类型不止一种:en.wikipedia.org/wiki/Rounding#Tie-breaking。因此,如果您将5.6舍入,就不知道会得到什么(没有指定要如何舍入)
zerkms 2012年

1
@zerkms,是的ceil()floor()其功能确实与相似,并且其舍入功能不同。
Starx 2012年

Answers:


94

使用round()函数获取整数舍入值。

round(8 / 3); // 3

要么

使用floor()函数获取整数值

floor(8 / 3); // 2

10
不同意 floor(-8 / 3)=== -3.0,但应为
--2

14
请注意,这floor()将返回一个floatNOT整数,因此您得到2.0and not 2。强制转换结果以确保您获得整数:(int)floor(8/3)
Jason

2
@ByScripts -8/3 = -3-8/3 = -2一样是有效的整数除法。前者是“向负无穷大的截断”,而后者是“向零无穷大的截断”。两者都有优势,不同的语言选择不同的行为。例如,C截断为零(PHP 7intdiv截断),而Python截断为负无穷大。
Mark Amery

请注意,ceil()总是四舍五入。
Ales


21

PHP中没有整数除法运算符。1/2产生浮点数0.5。可以将值强制转换为整数以向下舍入,或者round()函数可以更好地控制舍入。


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

PhP手册


7

用这个....

intval(1700000 / 300000 )...

这将返回整数值。


6
(int)(1700000 / 300000);

使用类型转换。


4
w!只是因为(0.1 + 0.7)== 0.799999 ...而不是0.8 :) :) :)
Jesse Chisholm

3
@ luc.chante您给出的示例由于浮点错误而发生。的精确值(0.1 + 0.7) * 107.99999999999999911182158029987476766109466552734375(int)强制转换将这个值截断为7是完全正确的。在将整数除以另一个整数时(如此处的问答),这种浮点错误不能更改截断后的结果。
Mark Amery

这样可以在执行整数除法时重现C / C ++中预期的确切行为,因此我完全看不到问题。
亚历克西斯威尔克

6

有几种方法可以在PHP中执行整数除法。该语言没有用于整数除法的运算符,但是有几种方法可以将浮点商四舍五入为整数:

<?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

在PHP 7上,您可以intdiv($p, $q)用来直接执行整数除法。这等效(int)($p / $q)于PHP 5。


5

您可以在末尾加| 0来使用简写形式

8/3 | 0


3
-1; 这是对“按位或”运算符的令人困惑的滥用。诚然,它可以工作(因为按位运算符的操作数被强制转换为整数,从而将浮点值向下取整,按位或0的实际运算不会导致结果整数值发生变化),但是为了使开发人员读取此代码了解为什么它起作用,他们需要知道PHP的按位运算符的转换行为(这是晦涩的琐碎知识,PHP的99%的开发人员不会知道)以及按位或值为0会使值保持不变(不保证,因为并非所有网络开发人员了解位操作)。
马克·阿默里

1
@ MarkAmery,mos开发人员不知道它的事实并不意味着它不起作用。显然,这是支持的一个很好的理由,因此人们将学习如何使用它。
Besi 2016年

2
是的,它令人困惑,因此不应该在生产代码中使用,但是它不会改变它是一个有趣的问题解决方案的事实
Tomasz Swider

@TomaszSwider有些人可能还会搜索最短的解决方案(尤其是在某些代码挑战中)。
Besi

1
JavaScript一直在使用它。程序员现在应该意识到这个技巧了……
Alexis Wilke

4

对于PHP 7 tryintdiv()函数:

句法: int intdiv($dividend, $divisor)

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

对于旧版本的PHP:

         <?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";
         ?>

截至2019年8月,这是唯一正确的答案。
DomQ

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.