在PHP中获取float的小数部分的最佳方法是什么?

时间:2008-09-08 21:59:23

标签: php

简单一:如何在PHP中找到浮点数的小数部分?例如,如果我的值为1.25,我想返回0.25。

10 个答案:

答案 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)

Credit.

答案 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;