I intend to write a GUI java program which convert a decimal(base 10) to hexadecimal(base 16). Floating point decimals are also valid input. the code of my program

private void myEnterButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              

    float mynum;
    mynum = Float.parseFloat(this.myNumberField.getText());

    Float floatObject = Float.valueOf(mynum);
    myResultField.setText(Float.toHexString(mynum));
    }       

but when I run the program, the input of 12.9 gives 0x1.9cccccp3, whereas I want the output as C.E6666

Help me to solve this problem.

Dani AI

Generated

Short clarification and a compact fix

’s target form "C.E6666" is the ordinary base‑16 (radix‑16) representation: integer part 12 → C, fractional part 0.9 → E6666... obtained by repeatedly multiplying the fractional remainder by 16. Float.toHexString shows Java’s IEEE‑754 hexadecimal floating‑point literal (that’s why 12.9f prints as 0x1.9cccccp3), which is a hex encoding of the binary mantissa with a power‑of‑two exponent — not the human‑style hex digits around the radix point.

A robust way to produce the format you want is to treat the input as an exact decimal (use BigDecimal(String)), extract the integer with toBigInteger() and convert it with toString(16), then build the fractional hex digits by looping: multiply the fractional remainder by 16, take the integer part as the next hex digit, subtract it, and repeat to the desired precision. Termination detection (to show repeating groups like the repeating 6 in 0.9) requires tracking seen remainders; fractions terminate in base‑16 only when the simplified denominator is a power of 2.

A compact Java example (uses BigDecimal/BigInteger) that returns N hex fractional digits:

static String decimalToHex(String s, int fracDigits) {
    BigDecimal x = new BigDecimal(s);
    BigInteger intPart = x.toBigInteger();
    BigDecimal frac = x.subtract(new BigDecimal(intPart));
    StringBuilder out = new StringBuilder(intPart.toString(16).toUpperCase());
    if (frac.compareTo(BigDecimal.ZERO) == 0 || fracDigits <= 0) return out.toString();
    out.append('.');
    for (int i = 0; i < fracDigits; i++) {
        frac = frac.multiply(BigDecimal.valueOf(16));
        int d = frac.intValue();
        out.append("0123456789ABCDEF".charAt(d));
        frac = frac.subtract(new BigDecimal(d));
        if (frac.compareTo(BigDecimal.ZERO) == 0) break;
    }
    return out.toString();
}

This approach implements ’s multiply‑by‑16 idea while avoiding binary float rounding; for decimalToHex("12.9",5) it produces C.E6666.

Recommended Answers

All 13 Replies

Can you explain the arithmetic you did to get that results?

Can you explain the arithmetic you did to get that results?

No arithmetic, just inbuilt java function/library to convert a decimal number(base 10) with floating point to a a floating point hexadecimal. Isn't there a function like that? I think there is a function for conversion of Integer.

If there is no pre-defined/inbuilt function in java then I have to go through a long process where:

  1. Input as a string (an array of char)
  2. Conversion of string to digits (separate for before and after point as in for 1234.678 to 1234 and 678)
  3. Arithmetic operations of digits to hexadecimal (here separate equivalent for 1234 and 678).
  4. Conversion of digits to string.
  5. Output as string.

Hope you understand what my intentions are!

Can you show how you got C.E6666 from 12.9? I see where the C came from. What about the E6666?

Also can you show what the HEX STRING of 1234.678 would be?

java function/library to convert a floating point to a a floating point hexadecimal.

What is the problem with the Float class's toHexString method?

What i need is a hexadecimal equivalent of a decimal floating number. A decimal 12.9 is equivalent to C.E6666. So help me how to do this.

Pliz explain me by modifying my code. Thnx

decimal 12.9 is equivalent to C.E6666

Please explain how you get that value. This is the third time I have asked this question.

Lets take Decimal no: 123.9
1st integer part : 123

123%16= 11 = B in hex, 123/16= 7
7%16= 7 = 7 in hex
(7/16=0 so stop)
So result is 7B

Now floating part: 0.9
160.9= 14.4, integer part= 14 =E in hex
16
0.4= 6.4, int part= 6 = 6 in hex
16*0.4= 6.4, same 6 in hex
contd upto 5 places
to get E6666
thus the result is 7B.E666

Now floating part: 0.9
160.9= 14.4, integer part= 14 =E in hex
160.4= 6.4, int part= 6 = 6 in hex
16*0.4= 6.4, same 6 in hex
contd upto 5 places
to get E6666

That makes no sense to me. How does 0.9 become E6666? Your explanation leaves out some stuff.
What is this: 160.9 = 14.4??? where did the 160.9 come from? What operation do you do on that amount to get 14.4?

My Mistake, here is the explanation

floating part: 0.9
16 * 0.9= 14.4, integer part= 14 =E in hex
16 * 0.4= 6.4, int part= 6 = 6 in hex
16 * 0.4= 6.4, same 6 in hex
contd upto 5 places
to get E6666
thus the result is 7B.E666

I am very sorry for the trouble. Actually I used a nokia mobile last time so....
Anyways hope I have explain this time.

I think I see now. The digits to the right of the decimal point are 1/16^x where x goes from 1 to n as the digits go to the right.
Converting E666 to decimal would give: 14/16 + 6/256 + 6/4096 + 6/65536 = 0.899993896484375

If you have the algorithm for converting a float to that format, what is your question? Where are you having problems writing the code?

the thing is I thought there is an inbuilt java function/method to convert a floating point decimal number to equivalent floating point hexadecimal number.
Like when I enter 123.9 as decimal then the output would be 7B.E6666 (using inbuilt java function in a line).
I hate to say but I am looking for only inbuilt function.

Sorry,I don't know of any such methods in java SE.

Do you see why the result is 0x1.9cccccp3?

I don't think you can do any better than that with the standard library. Converting fractions into other bases is not a very common need (unlike integers, which are quite handy to have in base-N sometimes.)

What you might do with a minimal amount of coding is take the fractional part, multiply it by 16^N where N is the number of hexadecimal places you want, convert it to an integer, and output that in hex -- something like this (untested):

System.out.printf("%x.%x\n", (int)x, (int)((x - int(x))*0x1000000))

Good luck

Ok I'll try with basics.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.