Size on disk is a multiple of the disk's block size. Short version: Files aren't stored on disk as the exact number of bytes that they are, because the tiny variances between file sizes can make the process of reading from disk painful and inefficient. Instead, disks have a block size (usually 4096 bytes, although this is user-configurable), and every file on the disk is read and written in blocks rather than bytes.
So, file size is a measure of how many bytes are taken up by file data, but size on disk is how many bytes the file actually takes up on the disk due to blocking. A file that is between 1-4096 bytes large will take up a single 4096-byte block, and its size on disk is therefore 4KB. The second that file becomes 4097 bytes large, it must use 2 blocks, and its size on disk will become 8KB.
The 0 byte disk-size file is an artifact of the file table. Metadata about the file (name, path, type, etc.) are stored in the file table, which takes up a separate section of the disk and does not count towards the size of the file proper. Due to an optimization of the way file tables can store data, certain small files may have their contents stored in the file table, along with their metadata. This is (as far as I know) completely out of your control.