Сначала вы создаете словарь , а затем передаете этот словарь в OrderedDict
. Когда вы это сделаете, заказ уже не будет правильным. dict
по своей сути не упорядочен.
Вместо этого переходите к последовательности наборов:
ship = [("NAME", "Albatross"),
("HP", 50),
("BLASTERS", 13),
("THRUSTERS", 18),
("PRICE", 250)]
ship = collections.OrderedDict(ship)
Что вы видите, когда вы печатаете OrderedDict
, это представление , и это совершенно правильно. OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
просто показывает вам в воспроизводимом представлении то, что содержимое имеет OrderedDict
.
Наилучшее решение:
inline double twodec(double n) { return floor(n * 100 + 0.5) / 100; }
oss << twodec(1.0) << ' ' << twodec(1.009);
Обсуждение
Из http://www.cplusplus.com/reference/ios/fixed/ (курсив my)
Когда floatfield установлено на фиксированное значение, значения float записываются с использованием нотации с фиксированной точкой, что означает, что значение представлено с помощью точно столько же цифр во фракционной части, как указано в поле точности и без экспоненциальной части.
blockquote>Итак, «фиксированный» не будет работать.
Тем не менее, единственные способы, могут подумать о том, что вам нужно сделать:
- сначала округлить число до нужной точности (т.е.
floor(n * 100 + 0.5) / 100
), а затем использовать презентацию по умолчанию (т. е. не указывать фиксированную или научную или точность - еслиfixed
илиscientific
действуют, сначала очистите их с помощьюstd::cout.unsetf(std::ios::floatfield)
).- динамически задает точность, основанную на максимальном общем количестве числовых цифр, которые вы хотите видеть, до и после точки (именно это указывает точность); чтобы сделать это, вы можете определить, сколько цифр занимает часть до десятичной точки (возможно, используя базу данных 10) и добавить 2
- , передавая результат в
ostringstream
, затем удаляя завершающие 0 и любые '' (довольно отвратительный).
Это мое окончательное решение, основанное на ответе Тони:
template <typename T>
std::string stringForNumber( T f, int precision /* = 0 */, bool fixedWidth /*= false*/ )
{
std::ostringstream ss;
ss.setf(std::ios_base::fixed);
if (precision > 0)
ss << std::setprecision(precision);
ss << f;
std::string str(ss.str());
if (!fixedWidth) // Removing trailing 0
{
const auto pointLocation = str.find_first_of(".,");
if (pointLocation != std::string::npos)
{
const auto lastZeroPos = str.find_last_of('0');
const auto lastNotZeroPos = str.find_last_not_of('0');
if (lastNotZeroPos == pointLocation) // Integer number
str.erase(pointLocation);
else if (lastZeroPos != std::string::npos && lastNotZeroPos != std::string::npos && pointLocation < lastZeroPos && lastNotZeroPos < lastZeroPos)
{
str.erase(lastNotZeroPos+1);
}
}
}
return str;
}
setprecision
. Жаль, что такая простая задача не может быть решена стандартной библиотекой без дополнительного кодирования ... – Violet Giraffe 13 February 2013 в 12:55