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

Php 如何获得数字的整数和小数部分?,php,math,Php,Math,假设是1.25-我如何得到这个数字的“1”和“25”部分 我需要检查小数部分是.0、.25、.5还是.75 $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 ($n

假设是1.25-我如何得到这个数字的“1”和“25”部分

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

$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
  );
}
函数NumberBreakdown($number,$returnUnsigned=false)
{
$负=1;
如果($number<0)
{
$negative=-1;
$number*=-1;
}
如果($returnUnsigned){
返回数组(
楼层(数字),
($number-楼层($number))
);
}
返回数组(
楼层($编号)*$负,
($number-楼层($number))*$negative
);
}

$returnUnsigned
阻止它将-1.25转换为-1&-0.25

此代码将为您拆分:

list($whole, $decimal) = explode('.', $your_number);
$num = 5.25;
$int_part = intval($num);
$dec_part = $num * 100 % 100;
其中,$total是整数,$decimal将在小数点后有数字。

只是不同:)


作为一个额外的好处,它只会在两边都是数字的情况下进行分割。

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

这是我使用的方法:

$float = 4.3;    

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

将其转换为整数并进行减法运算

$integer = (int)$your_number;
$decimal = $your_number - $integer;
或者只是为了得到小数点进行比较

$decimal = $your_number - (int)$your_number

布拉德·克里斯蒂的方法基本上是正确的,但可以写得更简洁

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

    return $fraction;
}
函数提取分数($value)
{
$fraction=$value-下限($value);
如果($value<0)
{
$fraction*=-1;
}
返回$fraction;
}
这相当于他的方法,但更短,希望因此更容易理解

短距离(使用地板和fmod)

然后将$decimal与0、.25、.5或.75进行比较。floor()方法不适用于负数。每次都是这样:

val = -3.1234

fraction = abs(val - as.integer(val) ) 
$num = 5.7;
$whole = (int) $num;  // 5
$frac  = $num - $whole;  // .7
…也适用于负片(相同代码,不同编号):


为了防止额外的浮点小数(即50.85-50给出0.85000000852),在我的例子中,我只需要2个小数表示货币美分

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

PHP5.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

我很难找到一种方法来真正区分美元金额和小数点后的金额。我想我大部分时间都在想,如果雅尔有什么问题,我想和大家分享一下

所以基本上

如果价格是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;

这里没有看到一个简单的模数

$number         = 1.25;
$wholeAsFloat   = floor($number);   // 1.00
$wholeAsInt     = intval($number);  // 1
$decimal        = $number % 1;      // 0.25
在这种情况下,获取
$wholeAs?
$decimal
不依赖于另一个。(您可以单独获取3个输出中的1个)我显示了
$wholeAsFloat
$wholeAsInt
,因为它返回一个浮点型数字,即使它返回的数字始终是整数。(如果要将结果传递到类型提示的函数参数中,这一点很重要。)

我希望将一个小时/分钟的浮点数(例如96.25)分别拆分为小时和分钟(例如96小时15分钟)。我是这样做的:

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

在我的例子中,我不在乎秒数。

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

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

不知道性能,但对于我的简单案例来说,这要好得多

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

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

$num = 5.25;
$int_part = intval($num);
$dec_part = $num * 100 % 100;
这种方法不涉及基于字符串的函数,并且可以防止在其他数学运算中可能出现的精度问题(例如使用0.4999999999而不是0.5)

还没有用极值进行彻底测试,但它在价格计算方面对我来说很好

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

$num = 5.25;
$int_part = intval($num);
$dec_part = $num * 100 % 100;
如果您希望始终获得正数,只需在计算之前添加
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分

这样试试。。。这样比较容易

$var = "0.98";

$decimal = strrchr($var,".");

$whole_no = $var-$decimal;

echo $whole_no;

echo str_replace(".", "", $decimal);

您也可以使用类似以下内容:

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

一个简单的爆炸会起作用吗$splitDec=分解(“.”,$decimal)$splitDec[0]现在将变为1,splitDec[1]现在将变为25。@Matt
split()
已被弃用。@alex yea,忘记了。我在想javascript。更改为explode。@Matt,split从PHP 5.3开始就被弃用,它实际上使用正则表达式作为参数,而explode使用字符串。在这种情况下,explode()是首选。请注意
explode(“.”,1.10)
将给出1和1,而不是1和10作为一个边,
intval()
或简单的铸造为
(int)
可能比
floor()
floor()更有效,floor如何解释负片?@LanceH:没有,但你可以用负片标记使其非常容易地处理。这个答案实际上是不准确的,除非你加上一轮()。我知道这听起来很蠢,但它与低级浮点数运算有关。请参见此处:尝试使用510.9,返回0.89。但是不知道为什么。注意
爆炸(“.”,1.10)将给出1和1,而不是1和10。如果数字是整数或不包含小数部分,则会中断并引发有关未定义索引的警告。这假设在转换为字符串时,数字不会以科学记数法表示。如果它是一个非常大或非常小的数字,则不会出现这种情况,此方法将中断。当您的数字为:$value=100000000000.0001111;若数字不包含小数部分,则此项不会中断。伟大的很好,它输出两个整数;而不是一个整数和一个浮点数。这个混蛋
$var = "0.98";

$decimal = strrchr($var,".");

$whole_no = $var-$decimal;

echo $whole_no;

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