PHP:获取小数位数
在PHP中,有没有一种简单的方法来确定(n)整数值/双数值的小数位数?(也就是说,不使用explode)您可以尝试将其转换为整数,从数字中减去整数,然后计算剩余的数值。类似于: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
$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