如何获得一个数字的整数和小数?

Sta*_*bie 87 php math

比如说,1.25 - 我怎么得到这个数字的"1"和"25"部分?

我需要检查小数部分是.0,.25,.5还是.75.

Bra*_*tie 155

$n = 1.25;
$whole = floor($n);      // 1
$fraction = $n - $whole; // .25
Run Code Online (Sandbox Code Playgroud)

然后比较1/4,1/2,3/4等.


如果是负数,请使用:

function NumberBreakdown($number, $returnUnsigned = false)
{
  $negative = 1;
  if ($number < 0)
  {
    $negative = -1;
    $number *= -1;
  }

  if ($returnUnsigned){
    return array(
      floor($number),
      ($number - floor($number))
    );
  }

  return array(
    floor($number) * $negative,
    ($number - floor($number)) * $negative
  );
}
Run Code Online (Sandbox Code Playgroud)

$returnUnsigned作出停止其-1.25-1-0.25

  • 作为一方,`intval()`或简单的转换为`(int)`可能比`floor()更高效. (5认同)
  • 除非你添加一个round(),否则这个答案实际上是不准确的.听起来很蠢,我知道,但它与低级浮点数运算有关.请参见此处:http://stackoverflow.com/questions/3726721/php-math-precision (4认同)

she*_*mer 34

此代码将为您拆分:

list($whole, $decimal) = explode('.', $your_number);
Run Code Online (Sandbox Code Playgroud)

其中$ whole是整数,$ decimal将包含小数点后的数字.

  • 请注意`explode(".",1.10);`将给出1和1,而不是1和10 (8认同)
  • 如果number是整数或不包含小数部分,则会中断并抛出有关未定义索引的警告. (3认同)

ale*_*lex 19

只是为了与众不同:)

list($whole, $decimal) = sscanf(1.5, '%d.%d');
Run Code Online (Sandbox Code Playgroud)

CodePad.

作为额外的好处,它只会在双方由数字组成的地方分开.

  • 如果数字不包含小数部分,则该数字不会中断。伟大的! (2认同)

the*_*ude 13

floor()方法不适用于负数.每次都有效:

$num = 5.7;
$whole = (int) $num;  // 5
$frac  = $num - (int) $num;  // .7
Run Code Online (Sandbox Code Playgroud)

...也适用于否定(相同的代码,不同的数字):

$num = -5.7;
$whole = (int) $num;  // -5
$frac  = $num - (int) $num;  // -.7
Run Code Online (Sandbox Code Playgroud)

  • 这个答案已经在下面给出。 (2认同)

Dom*_*Dom 7

将其转换为int并减去

$integer = (int)$your_number;
$decimal = $your_number - $integer;
Run Code Online (Sandbox Code Playgroud)

或者只是为了比较得到小数

$decimal = $your_number - (int)$your_number
Run Code Online (Sandbox Code Playgroud)


mpa*_*cia 6

一小段路(使用楼层和fmod)

$var = "1.25";
$whole = floor($var);     // 1
$decimal = fmod($var, 1); //0.25
Run Code Online (Sandbox Code Playgroud)

然后将$ decimal与0,.25,.5或.75进行比较


小智 5

还有一个可以使用的 fmod 函数: fmod($my_var, 1) 将返回相同的结果,但有时会出现较小的舍入误差。


Vas*_*lov 5

PHP 5.4+

$n = 12.343;
intval($n); // 12
explode('.', number_format($n, 1))[1]; // 3
explode('.', number_format($n, 2))[1]; // 34
explode('.', number_format($n, 3))[1]; // 343
explode('.', number_format($n, 4))[1]; // 3430
Run Code Online (Sandbox Code Playgroud)


Mar*_*rcM 5

对于那些想要将整数部分和小数部分拆分为两个整数分隔值的人来说,这只是一个新的简单解决方案:

5.25 -> 整数部分:5;小数部分:25

$num = 5.25;
$int_part = intval($num);
$dec_part = $num * 100 % 100;
Run Code Online (Sandbox Code Playgroud)

这种方式不涉及基于字符串的函数,并且可以防止其他数学运算中可能出现的准确性问题(例如使用 0.49999999999999 而不是 0.5)。

还没有对极值进行彻底测试,但它对我来说对于价格计算来说效果很好。

但是,要小心!现在从-5.25你得到: 整数部分:-5;小数部分:-25

如果您想始终获得正数,只需abs()在计算前添加:

$num = -5.25;
$num = abs($num);
$int_part = intval($num);
$dec_part = $num * 100 % 100;
Run Code Online (Sandbox Code Playgroud)

最后,打印带有 2 位小数的价格的奖励片段:

$message = sprintf("Your price: %d.%02d Eur", $int_part, $dec_part);
Run Code Online (Sandbox Code Playgroud)

...这样您就可以避免得到 5.5 而不是 5.05。;)