VxVM command such as "vxprint" reports the size of objects such as volume/plex/subdisk in terms of number of blocks and usually block size is 512 bytes. Which means 1Kbytes = 2 blocks.
In the o/p of second image 1048576 blocks = 1048576 / 2 = 524288 KBytes => 524288 / 1024 => 512 MBytes
In "dh" you have explicitly mentioned -k and hence it printed o/p in that format.
Vxprint also has human-readable print option such which can show o/p in similar format.
vxprint -uh will convert the blocks in near by unit of KB/GB/TB and u can control is you want o/p in specific unit e.g
-ug => Giga bytes
-uk => Kilo Bytes
-ut => terra bytes
vxprint -v -uh
Disk group: datadg
TY NAME ASSOC KSTATE LENGTH PLOFFS STATE TUTIL0 PUTIL0
v vol1 fsgen ENABLED 30.00t - ACTIVE - -
vxprint -v -ug
Disk group: datadg
TY NAME ASSOC KSTATE LENGTH PLOFFS STATE TUTIL0 PUTIL0
v vol1 fsgen ENABLED 30720.00g - ACTIVE - -