PHP:获取小数位数

PHP:获取小数位数,php,decimal,Php,Decimal,在PHP中,有没有一种简单的方法来确定(n)整数值/双数值的小数位数?(也就是说,不使用explode)您可以尝试将其转换为整数,从数字中减去整数,然后计算剩余的数值。类似于: <?php $floatNum = "120.340304"; $length = strlen($floatNum); $pos = strpos($floatNum, "."); // zero-based counting. $num_of_dec_places = ($length - $pos) -

在PHP中,有没有一种简单的方法来确定(n)整数值/双数值的小数位数?(也就是说,不使用explode)

您可以尝试将其转换为整数,从数字中减去整数,然后计算剩余的数值。

类似于:

<?php

$floatNum = "120.340304";
$length = strlen($floatNum);

$pos = strpos($floatNum, "."); // zero-based counting.

$num_of_dec_places = ($length - $pos) - 1; // -1 to compensate for the zero-based count in strpos()

?>

这是程序性的,笨拙的,我不建议在生产代码中使用它。但这应该让你开始

$str = "1.23444";
print strlen(substr(strrchr($str, "."), 1));
产出:

Testing [1] : 0 decimals
Testing [1.1] : 1 decimals
Testing [1.22] : 2 decimals
Testing [123.456] : 3 decimals
Testing [0] : 0 decimals
Testing [1] : 0 decimals
Testing [1.0] : 0 decimals
Testing [not a number] : 0 decimals
f = 0
i = 1
d = 0

f = 1
i = 1
d = 0

f = 1.23456789
i = 1
d = 8

f = -123.14
i = 3
d = 2

f = 1234567890
i = 10
d = 0

f = 12345.6789
i = 5
d = 4

我使用以下方法来确定返回值是否有小数(实际的小数值,而不仅仅是格式化为显示100.00这样的小数):

这个怎么样

$iDecimals = strlen($sFull%1);

下面是一个考虑尾部零的函数:

function get_precision($value) {
    if (!is_numeric($value)) { return false; }
    $decimal = $value - floor($value); //get the decimal portion of the number
    if ($decimal == 0) { return 0; } //if it's a whole number
    $precision = strlen($decimal) - 2; //-2 to account for "0."
    return $precision; 
}
Int 整数没有十进制数字,所以答案总是零

双重/浮动 双精度或浮点数是近似值。因此,它们没有定义的十进制数字计数

一个小例子:

$number = 12.00000000012;
$frac = $number - (int)$number;

var_dump($number);
var_dump($frac);
输出:

float(12.00000000012)
float(1.2000000992884E-10)
你可以在这里看到两个问题,第二个数字使用的是科学表示法,它不完全是1.2E-10

一串 对于包含整数/浮点的字符串,可以搜索小数点:

$string = '12.00000000012';
$delimiterPosition = strrpos($string, '.');
var_dump(
  $delimiterPosition === FALSE ? 0 : strlen($string) - 1 - $delimiterPosition
);
输出:

int(11)

我需要一个能够处理各种数字格式的解决方案,并提出了以下算法:

// Count the number of decimal places
$current = $value - floor($value);
for ($decimals = 0; ceil($current); $decimals++) {
    $current = ($value * pow(10, $decimals + 1)) - floor($value * pow(10, $decimals + 1));
}

// Count the total number of digits (includes decimal places)
$current = floor($value);
for ($digits = $decimals; $current; $digits++) {
    $current = floor($current / 10);
}
结果:

input:    1
decimals: 0
digits:   1

input:    100
decimals: 0
digits:   3

input:    0.04
decimals: 2
digits:   2

input:    10.004
decimals: 3
digits:   5

input:    10.0000001
decimals: 7
digits:   9

input:    1.2000000992884E-10
decimals: 24
digits:   24

input:    1.2000000992884e6
decimals: 7
digits:   14

首先,我使用
strpos
函数找到了小数点的位置,并将
strpos
位置值增加1以跳过小数点

其次,我从点1得到的值中减去整个字符串长度

第三,我使用了
substr
函数来获取小数点后的所有数字

第四,我使用了
strlen
函数来获取小数点后字符串的长度

这是执行上述步骤的代码:

     <?php
        $str="98.6754332";
        echo $str;
        echo "<br/>";
        echo substr( $str, -(strlen($str)-(strpos($str, '.')+1)) );
        echo "<br/>";
        echo strlen( substr( $str, -(strlen($str)-(strpos($str, '.')+1))) );
    ?>

解决方案 解释 模式
*\。
表示小数点前的所有字符及其符号

在本例中,它是一个包含三个字符的字符串:
12.

preg\u replace
函数将这些缓存的字符转换为空字符串
(第二个参数)

在本例中,我们得到以下字符串:
1234555


strlen
函数计算保留字符串中的字符数。

您应始终注意不同的区域设置。欧洲地区使用逗号作为千位分隔符,因此接受的答案不起作用。有关修订的解决方案,请参见下文:

 function countDecimalsUsingStrchr($stringValue){
        $locale_info = localeconv();
        return strlen(substr(strrchr($stringValue, $locale_info['decimal_point']), 1));
    }

请参见

如果您希望其他开发人员的可读性,请使用:

function countDecimalPlacesUsingStrrpos($stringValue){
    $locale_info = localeconv();
    $pos = strrpos($stringValue, $locale_info['decimal_point']);
    if ($pos !== false) {
        return strlen($stringValue) - ($pos + 1);
    }
    return 0;
}

请参见

这将适用于任何数字,即使是在科学记数法中,精度高达100位小数

$float = 0.0000005;

$working = number_format($float,100);
$working = rtrim($working,"0");
$working = explode(".",$working);
$working = $working[1];

$decmial_places = strlen($working);
结果:

7
冗长但没有复杂的条件。

代码更少:

$str=“1.1234567”;
echo STRPO(STREV($str),”);


我尝试将样本值更改为整数值,结果显示为“2”。我试图实现的是,如果数字是整数,则返回0,否则返回小数位数当你说“整数”时,整数的形式是“10.00”还是“10”?它的值是10。我期待不同的格式,如10,10.00,10.000。根据格式,我必须知道使用的小数位数注意,php将源代码中的文字1.0解释为整数,因此当转换为字符串时,它没有小数。(即使在声明时将其强制转换为float,因此
$variable=(float)1.0;
不起作用)这对非常小或非常大的浮点不起作用,当强制转换为字符串时,这些浮点将作为科学记法输出。var_dump(strval(1/1000000));在我看来,非常好的回答,如果我是对的,你一定是这么想的:
echo strlen($num-(int)$num)-2
$decimals=((int)$num!=$num)?(strlen($num)-strpos($num,'.')-1:0
也适用于负数。@EvanMattson这对溢出的非常大的浮点数不起作用。我在Dart中这样做,但这不起作用,因为浮点减法不精确,例如,执行
(3.005-3)。toString()。长度
得到了20。我在任何编程语言中都会出现这种行为?在本测试中,我在php上遇到了一个精度问题,返回0.9490000000001这在非常大或非常小的浮点上不起作用,这些浮点在表示为字符串时会转换为科学记法。例如:
var_dump((string)(0.00000000000012))输出
string(7)“1.2E-13”
@GordonM您可以使用number_格式解决这个问题:
$str=rtrim(number_格式($value,14-log10($value)),'0')。14基于PHP中浮点的最大精度;如果您首先对浮点进行一些数学运算(特别是如果它是通过减去两个较大的数字获得的),则可能需要将其减少一点。如果使用大量数字,则只减法1可能会更有效,而不是获得子字符串:strlen(strrchr($str,“.”)-1@戈登:你的解决方案真是天才。但这取决于php在将来某个时候不会改变精度,或者取决于非常不寻常的系统。如果您能解释一下您的解决方案是如何工作的,这将非常有帮助。@Stibu您好。我已经更新了答案,请检查并让我知道您是否有任何问题。您添加了一些文本,这绝对是一个好主意。因为我不熟悉PHP,所以我无法判断你文章的内容。我试图整理一下格式,并改写了你的最后一句话。如果您不同意这些更改,请随意删除它们或重新编辑。也许可以通过解释您的操作代码来改进此答案。此用例不会处理没有小数的值。这是正确的实现受限替换(用于关闭全局替换):
strlen(preg\u replace('/[\d]+[\.]?/',''$finalValue,1))
这很好,但有一个较短的方法可以做到:是数值($value)?max(strlen(strrchr(abs($value),“)-1,0):FALSE<代码>$sFull
     <?php
        $str="98.6754332";
        echo $str;
        echo "<br/>";
        echo substr( $str, -(strlen($str)-(strpos($str, '.')+1)) );
        echo "<br/>";
        echo strlen( substr( $str, -(strlen($str)-(strpos($str, '.')+1))) );
    ?>
$num = "12.1234555";
print strlen(preg_replace("/.*\./", "", $num)); // 7
 function countDecimalsUsingStrchr($stringValue){
        $locale_info = localeconv();
        return strlen(substr(strrchr($stringValue, $locale_info['decimal_point']), 1));
    }
function countDecimalPlacesUsingStrrpos($stringValue){
    $locale_info = localeconv();
    $pos = strrpos($stringValue, $locale_info['decimal_point']);
    if ($pos !== false) {
        return strlen($stringValue) - ($pos + 1);
    }
    return 0;
}
$float = 0.0000005;

$working = number_format($float,100);
$working = rtrim($working,"0");
$working = explode(".",$working);
$working = $working[1];

$decmial_places = strlen($working);
7