k mayank

Greenhorn

Posts: 27

posted 8 years ago

Hi Friends,

I have a strange stiuation here.

I need to use a float number(because it is 20 or more, digits long), then calculate hexadecimal of this number, and then save the result in an integer and use that as a key.

However, the below program prints 0x1.5af1d8p66

float x= 99999999999999999999f; //20 9's

System.out.println(Float.toHexString(x));

Now I'm not able to convert this String result "s" to integer. Please help.

Regards,

I have a strange stiuation here.

I need to use a float number(because it is 20 or more, digits long), then calculate hexadecimal of this number, and then save the result in an integer and use that as a key.

However, the below program prints 0x1.5af1d8p66

float x= 99999999999999999999f; //20 9's

System.out.println(Float.toHexString(x));

Now I'm not able to convert this String result "s" to integer. Please help.

Regards,

mayank

Ryan Beckett

Ranch Hand

Posts: 192

posted 8 years ago

1. A NumberFormatException will be thrown because the Hex value is floating point, and your trying to convert it to an Integer, a non-floating point data type.

2. A float can't represent a 20 digit number in binary. You lose precision when your print that variable. Nor can a double represent a value that big, so you'll have to use the BigDecimal class.

e.g

3. Unfortunately, I don't see how to convert a BigDecimal object to a Hex String. But, I hope that helps.

1. A NumberFormatException will be thrown because the Hex value is floating point, and your trying to convert it to an Integer, a non-floating point data type.

2. A float can't represent a 20 digit number in binary. You lose precision when your print that variable. Nor can a double represent a value that big, so you'll have to use the BigDecimal class.

e.g

3. Unfortunately, I don't see how to convert a BigDecimal object to a Hex String. But, I hope that helps.

Campbell Ritchie

Sheriff

Posts: 54024

130

k mayank

Greenhorn

Posts: 27

posted 8 years ago

Sorry,

Some how the code I posted was wrong.

float x= 99999999999999999999f; //20 9's

String s = Float.toHexString(x);

System.out.println(s);

Thanks for your reply. I have checked on the BigDecimal class before posting but dont want to write seperate code just to calculate Hexadecimal of a number.

looking for some java API which can do this for me.

Regards,

Some how the code I posted was wrong.

float x= 99999999999999999999f; //20 9's

String s = Float.toHexString(x);

System.out.println(s);

Thanks for your reply. I have checked on the BigDecimal class before posting but dont want to write seperate code just to calculate Hexadecimal of a number.

looking for some java API which can do this for me.

Regards,

mayank

k mayank

Greenhorn

Posts: 27

Campbell Ritchie

Sheriff

Posts: 54024

130

posted 8 years ago

Note that a

If you really need to preserve all the 20 digits, you should use an arbitrary-precision type such as BigInteger or BigDecimal (look those up in the Java API documentation).

k mayank wrote:I need to use a float number(because it is 20 or more, digits long), ...

Note that a

**float**(nor a

**double**) can store numbers of 20 digits. The precision of floats and doubles is limited: float can store about 7 decimal digits, and double about 15 decimal digits.

If you really need to preserve all the 20 digits, you should use an arbitrary-precision type such as BigInteger or BigDecimal (look those up in the Java API documentation).

k mayank

Greenhorn

Posts: 27

k mayank

Greenhorn

Posts: 27

posted 8 years ago

Hi Campbell,

As soon as I thought I have got this done someone pointed out the mistake.

When I give 256.0f, The answer I expect is 100 and not 4380000.

When I try String s = String.format("%x",256L); I get the required result,

But this can only work for long data type. This fails as soon as I give more than 19 digits and I need to work with 20 digita.

Can you let me know how to work through this.

A quick hint by all is very much appretiated as this is bocomming a priprity now.

Regards,

As soon as I thought I have got this done someone pointed out the mistake.

When I give 256.0f, The answer I expect is 100 and not 4380000.

When I try String s = String.format("%x",256L); I get the required result,

But this can only work for long data type. This fails as soon as I give more than 19 digits and I need to work with 20 digita.

Can you let me know how to work through this.

A quick hint by all is very much appretiated as this is bocomming a priprity now.

Regards,

mayank

Campbell Ritchie

Sheriff

Posts: 54024

130

posted 8 years ago

Somebody has already told you to use java.math.BigInteger; I think that will sort out your problem. It appears in Formatter that the %x tag can be applied to BigInteger.