You cannot do base 10 things and assume they work in base 2 the same way.
Double precision IEEE
0.1 = 0x3FB999999999999A
3.0 = 0x4008000000000000
12.34567 = 0x4028B0FBA8826AA9
0.1*3.0 = 0x3FD3333333333334
(0.1*3.0)/3.0 = 0x3FB999999999999B
single is easier to deal with on a calculator, and notice the interesting difference:
0.1 = 0x3DCCCCCD
3.0 = 0x40400000
12.34567 = 0x414587DD
0.1*3.0 = 0x3E99999A
(0.1*3.0)/3.0 = 0x3DCCCCCD
so first off
0x3DCCCCCD is 0 01111011 10011001100110011001101
Notice the repeating pattern just like in base ten if we have a three in the denominator 1/3 = 0.3333333. And like 1/6 0.16666667 because we rounded up. Well look one bit past the end it would have been 1001 at the end but that is one bit too many, if the number after the point you are going to chop off is greater than half you round up right so 0.1001 rounds to 0.101 in binary yes? same deal here.
In this case for your decimal numbers single precision came up with the right answer multiply some number by three then divide it again and you get the same number, but in double the rounding clips at a different point, we rounded up again and ended up with a number that was very slightly larger than started.
This can all be very easily seen in decimal. If my format is a fixed number of digits I have to stop at some point so 1/6 = 0.166666 lets say or it is 0.166667. and 6.0 is lets say 6.00000. So if I use my decimal floating point format and multiply 6 * (1/6) I get either 0.99996 or 1.000002 in neither case to I get 1. Not because of rounding but because the number cannot be accurately represented in that format.
If you get back the number you started with when you go from some base 10 ASCII string to float then back to some base 10 ASCII string, then that is just luck. Either the number was accurately represented in floating point or it wasnt. You can see with the very simple base 10 floating point above that no matter how many digits you have shy of infinity, you will not get 6 * (1/6) = 1, because base 10 float cannot accurately represent 1/6th in a fixed number of digits.
Looking at your other number
12.34567 = 0x414587DD
0 10000010 10001011000011111011101
12.34567 = 0x4028B0FBA8826AA9
0 10000000010 1000101100001111101110101000100000100110101010101001
1.10001011000011111011101
1.1000101100001111101110101000100000100110101010101001
Clearly single does not have enough bits to represent it, and there wasnt a round up as the next bit was a zero which is less than half. And the double keeps working numbers to the end, I am not going to hand convert this back to base 10, but am willing to bet you just got lucky. If you were to have many more bits would that settle down or not? Again I am not going to hand convert that for you. I think you should be able to see that even if you just looked at 0.1 and went to float and back to ASCII you dont get 0.1 back. Just like in base ten 1/6th doesnt convert there and back, if you round it you would get lucky: 5.9999... rounds to 6.0 if you clip/round it at the right place, but that is just rounding for the ASCII conversion and not the actual number represented by the floating point format.