12

I want to be able to convert big ints into their full string derivatives.

For example.

$bigint = 9999999999999999999;
$bigint_string = (string) $bigint;
var_dump($bigint_string);

outputs

string(7) "1.0e+19"

but i need

string(19) "9999999999999999999"

Please don't tell me that I should just originally set the $bigint value as a string. That is not an option. I really am stuck and don't know if it is even possible?

5
  • Precision has been lost. That's out of range for a float. You won't get the string output you want. Commented Aug 22, 2011 at 17:38
  • I guess the only way really is to initially cast as a string. balls. Commented Aug 22, 2011 at 17:48
  • 1
    Might have gotten more relevant answers if you explained the use case rather than what think you want. Commented Aug 22, 2011 at 17:49
  • I see no integer in your code. Where should it be? Commented Aug 22, 2011 at 17:56
  • @hakre - sorry. I did not realise that the big int would be a float. I've never dealt with numbers this large before. Commented Aug 22, 2011 at 17:58

4 Answers 4

13

You actually should ensure that you type what you mean:

$bigint = 9999999999999999999;

Is not a PHP integer but float:

float(1.0E+19)

If you would have done

$bigint = (int) 9999999999999999999;

You would have set an integer in fact, but it would not be the number you might have expected:

int(-8446744073709551616)

It's no problem at all to turn that into string as you might have guessed. So take care when you write numbers into code that you actually write what you mean.

See this line again:

$bigint = 9999999999999999999;

try to understand what you have actually written. It's not an integer at all because PHP will turn it into a float. See Example #4 Integer overflow on a 64-bit system in the integer manual page.

If you need higher precision, checkout GNU Multiple Precision, it might have what you're looking for. However, this won't change how to write numbers in PHP:

$bigint = gmp_init("9999999999999999999");
$bigint_string = gmp_strval($bigint);
var_dump($bigint, $bigint_string);

Output:

resource(4) of type (GMP integer)
string(19) "9999999999999999999"
Sign up to request clarification or add additional context in comments.

8 Comments

Thanks hakre for the in-depth response. I guess I have got plenty more to learn.
gmp_init() needs to start with a string or an int -- not a float. Which means, if you've already got it in a string or an int, you don't need gmp.
@buggedcom: You're welcome. There is always something new to learn ;)
this doesn't work if you pass it like this: $bigint = gmp_init(9999999999999999999);
@PhillPafford: Pass the number as integer or string, not float.
|
4

Use strval().

echo strval($bigint); // Will output "99999999999999999"

EDIT: After a slightly better research (> 5000ms), I see that it is impossible to echo numbers to that precision, because PHP cannot save an integer of that size (depends on OS bit system, 32/64). Seems like it's not possible to do it without losing precision.

8 Comments

@Evan ;) 5 seconds worth of Google search.
sorry, that is just the same as casting it as a string by (string) and it does not work. It will just output 1.0E+19
Actually, it calls _toString(), which isn't the same. But strval should have worked.
@Evan - what version of PHP are you using for that to work? Have you tested it yourself?
You can use third-party libraries, though. See stackoverflow.com/questions/211345/…
|
0

Use printf(), it's made for that:

echo printf("%d", $bigint);

1 Comment

This doesn't work for values greater than 32 bit. (Or 64, in whichever case.)
0

Just store the value as string and display...!

   $bigint = '9999999999999999999';

    var_dump($bigint);

Output:

string(19) "9999999999999999999"

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.