如何获得数字的整数和小数部分?


98

给定,例如1.25-如何获得该数字的“ 1”和“ .25”部分?

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


简单的爆炸会起作用吗?$ splitDec = explode(“。”,$ decimal); $ splitDec [0]现在将减1,而splitDec [1]现在将为25。
马特

@Matt split()已被弃用。
alex

@alex是的,忘记了。正在考虑使用javascript。变成爆炸。
马特

@Matt,split自PHP 5.3起已被弃用,实际上以正则表达式作为其arg,而explode采用字符串。在这种情况下,首选explode()。
shelhamer 2011年

4
请注意,将explode(".",1.10);给出1和1,而不是1和10
Michel

Answers:


177
$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-0.25


7
顺便说一句,intval()或者说简单的演员(int)表演可能比floor()
Jason McCreary

1
底价如何解释负面因素?
LanceH 2011年

@LanceH:不会,但是您可以使用负标记使它很容易处理。
布拉德·克里斯蒂

4
除非您添加round(),否则这个答案实际上是不准确的。我知道这听起来很愚蠢,但这与低级浮点数算法有关。看到这里:stackoverflow.com/questions/3726721/php-math-precision
Matt James

尝试使用510.9,返回0.89。但是不知道为什么。
T30

38

此代码将为您拆分:

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

其中$ whole是整数,而$ decimal是小数点后的数字。


9
请注意,将explode(".",1.10);给出1和1,而不是1和10
Michel

3
如果数字是整数或不包含小数部分,则会中断并引发有关未定义索引的警告。
Andreyco

1
假设将数字强制转换为字符串时最终不会以科学计数法表示。如果这是一个非常大或非常小的数字,则不是这种情况,并且此方法将失败。
GordonM

20

只是有所不同:)

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

键盘

另外一个好处是,它只会在两侧都由数字组成的地方分开。


2
如果数字不包含小数部分,则此位不会中断。大!
Andreyco

很好,它输出两个整数。而不是int和float。
福州

1
假设将数字强制转换为字符串时最终不会以科学计数法表示。如果这是一个非常大或非常小的数字,则不是这种情况,并且此方法将失败。
GordonM

18

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

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

...也适用于底片(相同代码,不同编号):

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

8

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

$var = "1.25";
$whole = floor($var);     // 1
$decimal = fmod($var, 1); //0.25

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


我接受这个答案!它接近C#(a % 1),并且可以很好地处理负数。
Bitterblue

7

将其转换为整数并减去

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

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

$decimal = $your_number - (int)$your_number

5

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


3

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


1

布拉德·克里斯蒂(Brad Christie)的方法本质上是正确的,但可以写得更简洁。

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

    return $fraction;
}

这等效于他的方法,但更短,希望因此更易于理解。



1

如果您可以指望它始终有两位小数,则可以使用字符串操作:

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

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


注意:如果这样做,则至少应使用round($ decimal,2); 首先确保您只有两位数字作为十进制。但是,如果您想掌握正确的数学或赚钱,则不能使用此功能。
Ulrik McArdle

0

为了防止多余的浮点小数(即50.85-50给出0.850000000852),在我的情况下,我只需要2个小数即可作为钱分。

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

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;

-1

这里没有看到简单的模数...

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

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

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

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

我不在乎秒数。


-3
val = -3.1234

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

2
嗨,请在代码中添加一些说明,因为它有助于理解您的代码。只回答代码的人不满意。
巴尔加夫Rao
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.