【发布时间】:2008-09-08 21:59:23
【问题描述】:
如何在 PHP 中找到浮点数的小数部分?
例如,如果我有值1.25,我想返回0.25。
【问题讨论】:
标签: php
如何在 PHP 中找到浮点数的小数部分?
例如,如果我有值1.25,我想返回0.25。
【问题讨论】:
标签: php
$x = $x - floor($x)
【讨论】:
$x = fmod($x, 1);
这是一个演示:
<?php
$x = 25.3333;
$x = fmod($x, 1);
var_dump($x);
应该输出
double(0.3333)
【讨论】:
abs() 包裹,所以它是:abs(fmod($x, 1))
不要忘记,您不能相信浮点运算是 100% 准确的。如果您对此感到担忧,则需要查看BCMath Arbitrary Precision Mathematics 函数。
$x = 22.732423423423432;
$x = bcsub(abs($x),floor(abs($x)),20);
你也可以自己破解字符串
$x = 22.732423423423432;
$x = strstr ( $x, '.' );
【讨论】:
如果数字是负数,你必须这样做:
$x = abs($x) - floor(abs($x));
【讨论】:
nlucaroni 提供的答案仅适用于正数。适用于正数和负数的可能解决方案是:
$x = $x - intval($x)
【讨论】:
我的PHP技能欠缺,但你可以从原来的数字中减去一个地板的结果
【讨论】:
但是,如果您正在处理诸如 perlin 噪声或其他图形表示之类的问题,则被接受的解决方案是正确的。它将为您提供较低数字的小数部分。
即:
.25 : 0 以下为整数,小数部分为 .25-.25 : -1 是下面的整数,小数部分是 .75对于其他解决方案,您将在下面将 0 重复为整数,更糟糕的是,您将得到所有负数的反转小数值。
【讨论】:
前面的一些答案是片面的。我相信,这是您处理所有情况所需要的:
function getDecimalPart($floatNum) {
return abs($floatNum - intval($floatNum));
}
$decimalPart = getDecimalPart($floatNum);
【讨论】:
你可以使用fmod函数:
$y = fmod($x, 1); //$x = 1.25 $y = 0.25
【讨论】:
为了避免这个页面上的混乱,实际上这是最好的答案,它速度很快,并且适用于 $x 的正值和负值:
$frac=($x<0) ? $x-ceil($x) : $x-floor($x);
我在 PHP 7.2.15 上运行了 1000 万次计算的速度测试,尽管两种解决方案给出了相同的结果,但 fmod 比 floor/ceil 慢。
$frac=($x<0) ? $x-ceil($x) : $x-floor($x);
-> 490-510 毫秒(取决于 $x 的符号)
$frac=fmod($x, 1);
-> 590 - 1000 毫秒(取决于 $x 的值)
而实际的空循环本身需要 80 毫秒(包括在上述时间中)。
测试脚本:
$x=sqrt(2)-0.41421356237;
$time_start = microtime(true);
for ($i=0;$i<=9999999;$i++) {
//$frac=fmod($x, 1); // version a
$frac=($x<0) ? $x-ceil($x) : $x-floor($x); // version b
}
$time_end = microtime(true);
$time = $time_end - $time_start;
【讨论】: