The missing support for using sprintf() with float/double variables is a classic problem. Often the solution is to use dtostrf() or handle the variable in its integer and decimal parts.
Today I wanted to help a friend and make a small demo program showing the issue and the solution. However, much to my surprise this has turned out quite differently than I expected. If the dtostrf() is used then the sprintf() works as "normal". WOW! Why is that? Below are some sample programs.
Well, even on the Arduino Zero sprintf float doesn't work unconditionally as my examples show. So there must be more to it. I.e. the sprintf has to be "warmed" up with dtostrf first.
I think you are seeing some other type of error in the first example. On an AVR-based Arduino, the result of using sprintf() to print a float value is always and unambiguously "?", unless you specifically enable the option.
Hardly anyone mentions the Zero on this forum, so you may not have much luck figuring out what the real problem is.
BTW the one correct format to printf a double value is "%lf".