Because toString() can not produce the exact floating point number, just like we don't often use == to compare two floating point numbers. For example, String.format("%f", 3.4f) would output 3.40000 and those 0's at the end will be trailed in later process, but 3.4f.toString() would output something like 3.400000234 then when we deserialize the big decimal from it, an IOException will be thrown.