简单一:如何在PHP中找到浮点数的小数部分?例如,如果我的值为1.25,我想返回0.25。
答案 0 :(得分:71)
$x = $x - floor($x)
答案 1 :(得分:14)
不要忘记你不能相信浮点运算是100%准确的。如果您对此感到担心,您需要查看BCMath Arbitrary Precision Mathematics函数。
$x = 22.732423423423432;
$x = bcsub(abs($x),floor(abs($x)),20);
你也可以自己破解字符串
$x = 22.732423423423432;
$x = strstr ( $x, '.' );
答案 2 :(得分:9)
如果数字为负数,则必须执行此操作:
$x = abs($x) - floor(abs($x));
答案 3 :(得分:9)
$x = fmod($x, 1);
这是一个演示:
<?php
$x = 25.3333;
$x = fmod($x, 1);
var_dump($x);
应该ouptut
double(0.3333)
答案 4 :(得分:8)
nlucaroni提供的答案仅适用于正数。适用于正数和负数的可能解决方案是:
$x = $x - intval($x)
答案 5 :(得分:3)
我的PHP技能缺乏,但您可以减去原始数字
的结果答案 6 :(得分:1)
但是,如果您正在处理类似于perlin噪声或其他图形表示的内容,则接受的解决方案是正确的。它将从较低的数字给出小数部分。
即:
.25
:0是整数,小数部分是.25 -.25
:-1是下面的整数,小数部分是.75 使用其他解决方案,您将在下面重复0作为整数,更糟糕的是,您将获得所有负数的反转小数值。
答案 7 :(得分:1)
前面的一些答案是部分的。我相信,这是您处理所有情况所需要的:
function getDecimalPart($floatNum) {
return abs($floatNum - intval($floatNum));
}
$decimalPart = getDecimalPart($floatNum);
答案 8 :(得分:0)
您可以使用fmod功能:
$y = fmod($x, 1); //$x = 1.25 $y = 0.25
答案 9 :(得分:0)
要真正避免此页面上的混乱,这是最好的答案,这是快速的,并且适用于$ 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;