capture drop x_4
gen double x_4=real(string(x,"%10.1f"))
Stata stores numbers in binary, and this has a second effect on numbers less than 1. 1/10 has no perfect binary representation just as 1/11 has no perfect decimal
representation. In float, .1 is stored as .10000000149011612. Note that there are 7 digits of accuracy, just as with numbers larger than 1. Stata, however, performs all
calculations in double precision. If you were to store 0.1 in a float called x and then ask, say, list if x==.1, there would be nothing in the list. The .1 that you just
typed was converted to double, with 16 digits of accuracy (.100000000000000014...), and that number is never equal to 0.1 stored with float accuracy.
One solution is to type list if x==float(.1). The float() function rounds its argument to float accuracy; see [D] functions. The other alternative would be store your
data as double, but this is probably a waste of memory. Few people have data that is accurate to 1 part in 10 to the 7th. Among the exceptions are banks, who keep
records accurate to the penny on amounts of billions of dollars. If you are dealing with such financial data, store your dollar amounts as doubles.