Я использую следующий код для округления до 2DP:Округление удваивается - 0,5 - Sprintf
sprintf(temp,"%.2f",coef[i]); //coef[i] returns a double
Он успешно завершает 6,666 до 6,67, но он не работает должным образом, когда округление 5.555. Он возвращает 5.55, тогда как он должен (по крайней мере, на мой взгляд) вернуться 5.56.
Как его получить, чтобы округлить, когда следующая цифра равна 5? т. е. вернуть 5.56.
Редактировать: Теперь я понимаю, что это происходит, потому что, когда я вхожу в 5.555 с cin, он получает , сохраненный как 5.554999997.
Я собираюсь попробовать округлить в два этапа - сначала до 3dp, а затем до 2dp. любые другие (более элегантные) идеи?
Это кажется немного более надежным, чем идея добавления 0,0005, но и будет работать, я думаю. Спасибо за вашу помощь! – Meir
На самом деле это ошибка. 5.5551 округляется правильно! – ypnos
Это не багги, @ypnos, вы просто еще не выходите за пределы плавающей запятой. 5.5551 представлен как 5.555100000000000370 ... который будет округлен, 5.555 представлен как 5.5549999999 ... который округляется вниз. Вы можете увидеть, что это проблема с представлением, попробовав свой код с 5.5500000000000000001 - оба выхода являются неправильным значением 5.55 в этом случае, потому что число IS NOT 5.55000 ... 1 при его сохранении. Это 5.549999 ... – paxdiablo