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

时间:2011-07-08 02:31:28

标签: php math

比如说,1.25 - 如何获得“1”和“25”这个数字的部分?

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

19 个答案:

答案 0 :(得分:151)

$n = 1.25;
$whole = floor($n);      // 1
$fraction = $n - $whole; // .25

然后与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
  );
}

$returnUnsigned阻止 -1.25 进入 -1 &amp;的 -0.25

答案 1 :(得分:33)

此代码将为您分割:

list($whole, $decimal) = explode('.', $your_number);

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

答案 2 :(得分:19)

只是为了与众不同:)

list($whole, $decimal) = sscanf(1.5, '%d.%d');

CodePad

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

答案 3 :(得分:13)

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

$num = 5.7;
$whole = (int) $num;  // 5
$frac  = $num - (int) $num;  // .7

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

$num = -5.7;
$whole = (int) $num;  // -5
$frac  = $num - (int) $num;  // -.7

答案 4 :(得分:6)

将其转换为int并减去

$integer = (int)$your_number;
$decimal = $whole - $integer;

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

$decimal = $your_number - (int)$your_number

答案 5 :(得分:6)

一个简短的方法(使用floor和fmod)

PassEnv CURRENT_PATH

SetEnv WP_DIR ${CURRENT_PATH}/app

然后将$ decimal与0,.25,.5或.75

进行比较

答案 6 :(得分:4)

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

答案 7 :(得分:2)

这是我使用的方式:

$float = 4.3;    

$dec = ltrim(($float - floor($float)),"0."); // result .3

答案 8 :(得分:2)

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

答案 9 :(得分:1)

Brad Christie的方法基本上是正确的,但可以更简洁地编写。

function extractFraction ($value) 
{
    $fraction   = $value - floor ($value);
    if ($value < 0)
    {
        $fraction *= -1;
    }

    return $fraction;
}

这相当于他的方法,但更短,希望更容易理解。

答案 10 :(得分:1)

$x = 1.24

$result = $x - floor($x);

echo $result; // .24

答案 11 :(得分:0)

为了防止额外的浮动十进制(即50.85 - 50给出0.850000000852),在我的情况下,我只需要2位小数就可以赚钱。

$n = 50.85;
$whole = intval($n);
$fraction = $n * 100 % 100;

答案 12 :(得分:0)

我很难找到实际分开美元金额和小数点后金额的方法。我想我大部分时间都想出来,如果有任何一个人遇到麻烦,我想分享一下

所以基本上......

如果价格是1234.44 ......整数将是1234而小数将是44或

如果价格是1234.01 ...整数将是1234而小数将是01或

如果价格是1234.10 ...整数将是1234而十进制将是10

等等

$price = 1234.44;

$whole = intval($price); // 1234
$decimal1 = $price - $whole; // 0.44000000000005 uh oh! that's why it needs... (see next line)
$decimal2 = round($decimal1, 2); // 0.44 this will round off the excess numbers
$decimal = substr($decimal2, 2); // 44 this removed the first 2 characters

if ($decimal == 1) { $decimal = 10; } // Michel's warning is correct...
if ($decimal == 2) { $decimal = 20; } // if the price is 1234.10... the decimal will be 1...
if ($decimal == 3) { $decimal = 30; } // so make sure to add these rules too
if ($decimal == 4) { $decimal = 40; }
if ($decimal == 5) { $decimal = 50; }
if ($decimal == 6) { $decimal = 60; }
if ($decimal == 7) { $decimal = 70; }
if ($decimal == 8) { $decimal = 80; }
if ($decimal == 9) { $decimal = 90; }

echo 'The dollar amount is ' . $whole . ' and the decimal amount is ' . $decimal;

答案 13 :(得分:0)

在这里看不到简单的模数...

$number         = 1.25;
$wholeAsFloat   = floor($number);   // 1.00
$wholeAsInt     = intval($number);  // 1
$decimal        = $number % 1;      // 0.25

在这种情况下,同时获取$wholeAs?$decimal并不相互依赖。 (您可以只取3个输出中的1个。)我已经显示了$wholeAsFloat$wholeAsInt,因为floor()返回的是浮点类型数字,即使返回的数字始终是整数。 (这很重要,如果要将结果传递给带有类型提示的函数参数。)

我希望这可以将小时/分钟的浮点数分开,例如96.25,DateInterval实例的小时数和分钟数分别为96小时15分钟。我这样做如下:

$interval = new \DateInterval(sprintf("PT%dH%dM", intval($hours), (($hours % 1) * 60)));

我不在乎我的情况。

答案 14 :(得分:0)

如果可以指望它总是有2个小数位,则可以使用字符串操作:

$decimal = 1.25;
substr($decimal,-2);  // returns "25" as a string

不知道性能,但是对于我的简单情况,这要好得多...

答案 15 :(得分:0)

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

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

$num = 5.25;
$int_part = intval($num);
$dec_part = $num * 100 % 100;

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

还没有对极值进行彻底的测试,但是对我而言,它可以很好地用于价格计算。

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

如果要始终获得正数,只需在计算前加上abs()

$num = -5.25;
$num = abs($num);
$int_part = intval($num);
$dec_part = $num * 100 % 100;

最后,是带有2位小数的印刷价格奖金片段:

$message = sprintf("Your price: %d.%02d Eur", $int_part, $dec_part);

...以便避免获得5.5而不是5.05。 ;)

答案 16 :(得分:0)

以这种方式尝试...这样更容易

let data={stuff:"content",stuff:"content",List:[{column:[{group:[{name:"item 1"},{name:"item 2"}],group:[{name:"item 3"},{name:"item 4"},{name:"item 5"},{name:"item 6"}],group:[{name:"item 7"},{name:"item 8"},{name:"item 9"},{name:"item 10"}]}],column:[{group:[{name:"item 11"},{name:"item 12"},{name:"item 13"},{name:"item 14"}],group:[{name:"item 15"},{name:"item 16"}],group:[{name:"item 17"},{name:"item 18"},{name:"item 18"}]}]}]};
// open the dev tool to see the table
console.table(data)

答案 17 :(得分:0)

你也可以这样使用:

preg_match("/([0-9]+)\.([0-9]+)/", $number, $matches);

答案 18 :(得分:-3)

val = -3.1234

fraction = abs(val - as.integer(val) )