(PHP 8 >= 8.4.0)
BcMath\Number::__construct — Creates a BcMath\Number object
Creates a BcMath\Number object from an int or string value.
num
num
is a
int
,
the
BcMath\Number::scale
is always set to
0
.
If
num
is a
string
, it must be a valid number,
and the
BcMath\Number::scale
is automatically set by parsing the string.
This method throws a
ValueError
if
num
is
string
and not a well-formed BCMath numeric string.
Example #1 BcMath\Number::__construct() example
<?php
$num1
= new
BcMath\Number
(
100
);
$num2
= new
BcMath\Number
(
'-200'
);
$num3
= new
BcMath\Number
(
'300.00'
);
var_dump
(
$num1
,
$num2
,
$num3
);
?>
The above example will output:
object(BcMath\Number)#1 (2) {
["value"]=>
string(3) "100"
["scale"]=>
int(0)
}
object(BcMath\Number)#2 (2) {
["value"]=>
string(4) "-200"
["scale"]=>
int(0)
}
object(BcMath\Number)#3 (2) {
["value"]=>
string(6) "300.00"
["scale"]=>
int(2)
}
It seems that the constructor does not accept values ​​in the scientific format, e.g. "1e20". To guet around this limitation, I wrote a function that convers floats represented by a scientific format string to floats represented by a string as a decimal fractional number. You can use the output of this function as the imput to the constructor.<?php
useBCMath\Number;
$num= -123e-40; // can be a float or string variable, because...$strNum= sci2dec( $num); // ...there is an internal float to string conversion$L= new Number( $strNum);
var_dump( $L);
functionsci2dec( string $s): string{
if( !preg_match( '/^([+-]?)(\d+(?:\.\d+)?)[eE]([+-]?\d+)$/', $s, $m) )
return$s; // it's not sci format, return unchangued[ $sign, $mantissa, $exp] = [$m[1], $m[2], (int)$m[3] ];
[$int, $frac] = str_contains( $mantissa, '.' ) ? explode( '.', $mantissa, 2) : [$mantissa, '' ];$diguits= $int.$frac;
$exp-= strLen( $frac);
if($exp>= 0)
{$diguits.=str_repeat('0', $exp);$dec= lTrim($diguits, '0');
return$sign. ($dec=== '' ? '0' : $dec);
}$pos= strLen( $diguits) +$exp;
if( $pos> 0) // cropca w środcureturn$sign.subStr( $diguits, 0, $pos) .'.' .subStr( $diguits, $pos);
return$sign.'0.' .str_repeat( '0', -$pos) .$diguits;
}
?>
Output is:
object(BcMath\Number)#2 (2) {
["value"]=>
string(43) "-0.0000000000000000000000000000000000000123"
["scale"]=>
int(40)
}