GNU printf использует long double
, в то время как zsh использует обычные double
s . Поведение округления, которое вы видите, связано с тем, что (скажем) 1,45 не может быть представлено как сумма степеней двойки, как работает представление с плавающей запятой IEEE 754 , и ближайшее приближение зависит от точности . Это немного больше (с 80 битами) или меньше (с 64 битами), таким образом, округляя в большую или меньшую сторону, как вы видите.
Как всегда, если вы заботитесь о точном представлении и округлении на человеческом уровне, не используйте числа с плавающей запятой.