The versions "0.1" and "~0.1" are exactly the same. The version "0.1.2" is different in that it doesn't allow the versions 0.1.0 and 0.1.1, so if another crate requires something like "=0.1.1", then you will fail to compile with "0.1.2", whereas "0.1" would compile it using 0.1.1.
From these, it's clear that 0.1 and ~0.1 have the same range.
But I encountered a situation when 0.1 and ~0.1 give very different results.
Some subtle difference beyond ranges exists, and I don't understand what is that.