I base my statements on the specific behavior of dBase 5 for DOS but should apply to most other versions as well.
Actually when a new record is added to a table, the numeric fields are empty. Not even a zero is there. Remember, the table's record is really just a long string of character data. So by default the portion of that record or string is really just empty spaces. If you do a BROWSE, EDIT, DISPLAY or LIST you will see nothing, just blanks.
Background... the database language interprets and writes to that file based upon its rules as contained in its commands and functions. When you open a table with USE <tablename>, it is similar to telling the program to make a call to FOPEN(). When you BROWSE or EDIT, it is similar to the program using FREAD() and display the contents. If you change anything, then when you go to the next ecord it will use the equivalent of FWRITE() to save those changes to the table. When you close the table with USE, it is similar to telling the program to make a call to FCLOSE(). In other words, many of the commands in dBase and other database programming languages are simply an added layer or interface to aid us (and protect us from ourselves and silly mistakes) in manipulating data.
That said, this added but user-friendly layer of functionality comes at a price. Certain behaviors are built in. If you BROWSE or EDIT, you can go to the field using the arrow, tab or enter keys and nothing gets changed. But type in something into a numeric field such as a number, period, minus or plus that the editing mask lets through and you will forevermore have some value in that field, even if it is only a zero. If you remove the number it will by default leave a zero there. And that zero is also present in the literal data string which comprises that file itself.
How to remove those pesky zeros? Within dBase you could write code to use FOPEN() and replce the zero values (if you had set it to have decimals, then you'd have to also search for those, such that 2 decimals would look like "0.00") with blanks or spaces. You would have to be extraordinarily careful that you only looked at the numeric fields and that code would have to be hand coded, quite tedious and very prone to mistakes you may not catch. FREAD() and FWRITE() know nothing about records and fields, as that is the layer added for us humans to use.
In short, dbase will never remove a zero from a numeric field which had been edited previously unless you access it in low-level mode which is hard and possibly dangerous for most programmers to tackle.