как предотвратить отображение чисел в научных записях
У нас естьStreamBuffer
класс, в котором мы не реализовалиstd::fixed
операции, и я пытаюсь предотвратить появление числа в научных обозначениях. С моим приведенным ниже кодом некоторые цифры отображаются в научных обозначениях. Мы хотим избежать каких-либо распределений, поэтому мы реализовалиStreamBuffer
класс по причине производительности.
Ниже приведен код:
T value = 0;
template<typename U> void process(U& buf, DataOption holder) const {
if (holder == DataOption::TYPES) {
switch (type_) {
case teck::PROC_FLOAT:
buf << "{\"float\":" << value << "}";
break;
case teck::PROC_DOUBLE:
buf << "{\"double\":" << value << "}";
break;
default:
buf << "{\"" << type_ << "\":" << value << "}";
}
}
}
И вот как это называется:
void HolderProcess::dump(std::ostream& os, DataOption holder) const
{
process<std::ostream>(os, holder);
}
void HolderProcess::dump(StreamBuffer& buffer, DataOption holder) const
{
process<StreamBuffer>(buffer, holder);
}
Я попытался использовать как показано ниже, и я получил ошибку, из-за которой я понял, что мы не можем использоватьstd::fixed
на моемStreamBuffer
учебный класс.
case teck::PROC_DOUBLE:
buf << "{\"double\":" << std::fixed << value << "}";
Какая альтернативаstd::fixed
Я могу использовать здесь, который не делает никаких распределений вообще. Я думал о преобразовании числа в строку, а затем применитьstd::fixed
на это, но это будет делать некоторые распределения, которые я хочу избежать этого.
Каков наилучший способ сделать это, который эффективен по производительности и не выполняет никаких распределений? У меня есть решение ниже, но он будет делать некоторые распределения, так как он использует строку. Я могу вызвать метод ниже из моего кода выше.
template <typename T> string str(T number)
{
std::ostringstream ss;
ss << std::fixed << number;
return ss.str();
}
Есть ли другой оптимизированный и эффективный способ?