假设给定1.25 -我如何得到这个数字的"1"answers"25"部分?
我需要检查小数部分是0、0.25、0.5还是0.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
);
}
$returnUnsigned
阻止-1.25 in到-1 &-0.25
下面的代码将为您拆分:
list($whole, $decimal) = explode('.', $your_number);
其中$whole为整数,$decimal为小数点后的数字。
floor()方法不适用于负数。每次都有效:
$num = 5.7;
$whole = (int) $num; // 5
$frac = $num - $whole; // .7
…也适用于负数(相同的代码,不同的数字):
$num = -5.7;
$whole = (int) $num; // -5
$frac = $num - $whole; // -.7
只是为了与众不同:)
list($whole, $decimal) = sscanf(1.5, '%d.%d');
CodePad .
作为一个额外的好处,它只会在两边都是数字的情况下分割。
a short way(使用floor and fmod)
$var = "1.25";
$whole = floor($var); // 1
$decimal = fmod($var, 1); //0.25
然后比较$decimal与0、0.25、0.5或0.75
将其转换为整型并减去
$integer = (int)$your_number;
$decimal = $your_number - $integer;
或者只是为了得到小数进行比较
$decimal = $your_number - (int)$your_number
也有一个fmod函数,可以使用:作用(my_var美元,1)将返回相同的结果,但有时会有一个小的舍入错误。
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
对于那些希望将整数部分和小数部分分割为两个整数分隔值的人来说,这是一个新的简单解决方案:
5.25→Int part: 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。div;)
我是这样做的:
$float = 4.3;
$dec = ltrim(($float - floor($float)),"0."); // result .3
Brad Christie的方法本质上是正确的,但它可以写得更简洁。
function extractFraction ($value)
{
$fraction = $value - floor ($value);
if ($value < 0)
{
$fraction *= -1;
}
return $fraction;
}
这相当于他的方法,但更短,希望更容易理解。
我很难找到一种方法来区分美元金额和小数点后的金额。我想我基本上都明白了,如果你们有什么问题,我想和你们分享。
基本上……
如果价格是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;
$x = 1.24
$result = $x - floor($x);
echo $result; // .24
如果你能指望它总是有2位小数,你可以使用字符串操作:
$decimal = 1.25;
substr($decimal,-2); // returns "25" as a string
不知道性能,但对于我的简单情况,这是更好的…
为了防止额外的浮点小数(即50.85 - 50给出0.850000000852),在我的例子中,我只需要2个小数来表示钱分。
$n = 50.85;
$whole = intval($n);
$fraction = $n * 100 % 100;
试试这样做…这样比较简单
$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);
如果您希望显式地对这两部分进行类型转换,那么sscanf()
是一个很好的调用。
代码(演示):
var_dump(sscanf(1.25, '%d%f'));
输出:array(2) {
[0]=>
int(1)
[1]=>
float(0.25)
}
或者您可以单独分配两个变量:
sscanf(1.25, '%d%f', $int, $float);
var_dump($int);
var_dump($float);
在将小时的十进制表达式转换为小时和分钟时,将小数部分转换为浮点数特别有用。(演示)
$decimalTimes = [
6,
7.2,
8.78,
];
foreach ($decimalTimes as $decimalTime) {
sscanf($decimalTime, '%d%f', $hours, $minutes);
printf('%dh%02dm', $hours, round($minutes * 60));
echo "'n";
}
输出:6h00m
7h12m
8h47m // if round() was not used, this would be 8h46m
这里没有看到简单的模数…
$number = 1.25;
$wholeAsFloat = floor($number); // 1.00
$wholeAsInt = intval($number); // 1
$decimal = $number % 1; // 0.25
在这种情况下,获得$wholeAs?
和$decimal
并不依赖于另一个。(你可以单独取三个输出中的一个。)我已经展示了$wholeAsFloat
和$wholeAsInt
,因为floor()
返回一个float类型的数字,即使它返回的数字总是整数。(如果要将结果传递给类型提示的函数参数,这一点很重要。)
我希望将小时/分钟的浮点数(例如96.25)分别拆分为小时和分钟,DateInterval实例为96小时15分钟。我的操作如下:
$interval = new 'DateInterval(sprintf("PT%dH%dM", intval($hours), (($hours % 1) * 60)));
在我的例子中我不关心秒
val = -3.1234
fraction = abs(val - as.integer(val) )