Правильно ли работает std :: noshowpoint в Visual Studio 2017? [Дубликат]

Сначала вы создаете словарь , а затем передаете этот словарь в 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.

3
задан Violet Giraffe 13 February 2013 в 12:20
поделиться

2 ответа

Наилучшее решение:

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 записываются с использованием нотации с фиксированной точкой, что означает, что значение представлено с помощью точно столько же цифр во фракционной части, как указано в поле точности и без экспоненциальной части.

Итак, «фиксированный» не будет работать.

Тем не менее, единственные способы, могут подумать о том, что вам нужно сделать:

  • сначала округлить число до нужной точности (т.е. floor(n * 100 + 0.5) / 100), а затем использовать презентацию по умолчанию (т. е. не указывать фиксированную или научную или точность - если fixed или scientific действуют, сначала очистите их с помощью std::cout.unsetf(std::ios::floatfield)).
  • динамически задает точность, основанную на максимальном общем количестве числовых цифр, которые вы хотите видеть, до и после точки (именно это указывает точность); чтобы сделать это, вы можете определить, сколько цифр занимает часть до десятичной точки (возможно, используя базу данных 10) и добавить 2
  • , передавая результат в ostringstream, затем удаляя завершающие 0 и любые '' (довольно отвратительный).
5
ответ дан Tony Delroy 19 August 2018 в 00:27
поделиться
  • 1
    Спасибо, я не понимал, что подразумевается setprecision. Жаль, что такая простая задача не может быть решена стандартной библиотекой без дополнительного кодирования ... – Violet Giraffe 13 February 2013 в 12:55
  • 2
    @VioletGiraffe: согласился, это отвратительно :-(. Надеюсь, у кого-то есть лучший ответ .... – Tony Delroy 13 February 2013 в 13:03

Это мое окончательное решение, основанное на ответе Тони:

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;
}
1
ответ дан Violet Giraffe 19 August 2018 в 00:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: