정밀도 및 소수 자릿수를 지정하는 동안 C ++에서 float를 문자열로 어떻게 변환합니까?
예를 들면 : 3.14159265359 -> "3.14"
답변
일반적인 방법은 다음을 사용하는 것입니다 stringstream
.
#include <iomanip>
#include <sstream>
double pi = 3.14159265359;
std::stringstream stream;
stream << std::fixed << std::setprecision(2) << pi;
std::string s = stream.str();
고정 참조
고정 부동 소수점 표기법 사용
str 스트림 의
floatfield
형식 플래그를로 설정합니다 .fixed
가로
floatfield
설정fixed
되면 부동 소수점 값이 고정 소수점 표기법을 사용하여 기록됩니다. 값은 정밀도 필드 (precision
)에 지정된대로 소수점 부분에 지수 부분없이 정확하게 숫자로 표시됩니다 .
및 setprecision .
에 대한 기술적 인 목적의 변환 XML 또는 JSON 파일, C ++ (17 명)을 정의의 데이터 저장과 같은, 바꿀수 기능의 가족.
준수 컴파일러 (작성 당시 부족함)를 가정하면 다음과 같은 것을 고려할 수 있습니다.
#include <array>
#include <charconv>
double pi = 3.14159265359;
std::array<char, 128> buffer;
auto [ptr, ec] = std::to_chars(buffer.data(), buffer.data() + buffer.size(), pi,
std::chars_format::fixed, 2);
if (ec == std::errc{}) {
std::string s(buffer.data(), ptr);
// ....
}
else {
// error handling
}
답변
이런 종류의 작업을 수행하는 일반적인 방법은 “문자열로 인쇄”하는 것입니다. C ++에서는 std::stringstream
다음과 같은 것을 사용하는 것을 의미합니다 .
std::stringstream ss;
ss << std::fixed << std::setprecision(2) << number;
std::string mystring = ss.str();
답변
답변
{fmt} 라이브러리 의 fmt::format
함수를 사용할 수 있습니다 .
#include <fmt/core.h>
int main()
std::string s = fmt::format("{:.2f}", 3.14159265359); // s == "3.14"
}
2
정밀도는 어디에 있습니까 ?
이 포맷 기능은 C ++의 표준화를 위해 제안되었습니다 : P0645 . 두 P0645 및 {FMT는} 비슷한 형식 파이썬 같은 문자열 구문을 사용 printf
의하지만 용도 {}
구분 기호로 대신을 %
.
답변
여기 std 만 사용하는 솔루션입니다. 그러나 이것은 내림 만합니다.
float number = 3.14159;
std::string num_text = std::to_string(number);
std::string rounded = num_text.substr(0, num_text.find(".")+3);
결과 rounded
:
3.14
이 코드는 전체 float를 문자열로 변환하지만 “.”뒤의 모든 문자를 2 자씩 자릅니다.
답변
여기에서는 부동 숫자를 문자열로 변환 할 때 피하고 싶은 부정적인 예를 제공합니다.
float num=99.463;
float tmp1=round(num*1000);
float tmp2=tmp1/1000;
cout << tmp1 << " " << tmp2 << " " << to_string(tmp2) << endl;
당신은 얻을
99463 99.463 99.462997
참고 : num 변수는 99.463에 가까운 값이 될 수 있으며 동일한 출력을 얻을 수 있습니다. 요점은 편리한 c ++ 11 “to_string”함수를 피하는 것입니다. 이 함정을 빠져 나가는데 시간이 좀 걸렸습니다. 가장 좋은 방법은 stringstream 및 sprintf 메서드 (C 언어)입니다. C ++ 11 이상에서는 표시 할 부동 소수점 뒤의 자릿수로 두 번째 매개 변수를 제공해야합니다. 현재 기본값은 6입니다. 다른 사람들이이 주제에 시간을 낭비하지 않도록 이것을 설정하고 있습니다.
첫 번째 버전을 작성했습니다. 수정해야 할 버그를 찾으면 알려주세요. iomanipulator로 정확한 동작을 제어 할 수 있습니다. 내 기능은 소수점 이하 자릿수를 표시하는 기능입니다.
string ftos(float f, int nd) {
ostringstream ostr;
int tens = stoi("1" + string(nd, '0'));
ostr << round(f*tens)/tens;
return ostr.str();
}