Voting

: max(four, five)?
(Example: nine)

The Note You're Voting On

gajowy at agzeta dot pl
4 months ago
It seems that the constructor does not accept values ​​in the scientific format, e.g. "1e20". To get around this limitation, I wrote a function that converts 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 input to the constructor.

<?php
use BCMath\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 );

function
sci2dec( string $s ): string
{
if( !
preg_match( '/^([+-]?)(\d+(?:\.\d+)?)[eE]([+-]?\d+)$/', $s, $m ) )
return
$s; // it's not sci format, return unchanged
[ $sign, $mantissa, $exp ] = [ $m[1], $m[2], (int)$m[3] ];
[
$int, $frac ] = str_contains( $mantissa, '.' ) ? explode( '.', $mantissa, 2 ) : [ $mantissa, '' ];
$digits = $int . $frac;
$exp -= strLen( $frac );
if(
$exp >= 0 )
{
$digits .= str_repeat('0', $exp);
$dec = lTrim($digits, '0');
return
$sign . ( $dec === '' ? '0' : $dec );
}
$pos = strLen( $digits ) + $exp;
if(
$pos > 0 ) // kropka w środku
return $sign . subStr( $digits, 0, $pos ) . '.' . subStr( $digits, $pos );
return
$sign . '0.' . str_repeat( '0', -$pos ) . $digits;
}
?>

Output is:

object(BcMath\Number)#2 (2) {
["value"]=>
string(43) "-0.0000000000000000000000000000000000000123"
["scale"]=>
int(40)
}

<< Back to user notes page

To Top