정밀도 및 소수 자릿수가 지정된 문자열로 float를 변환 하시겠습니까? C ++에서 float를

정밀도 및 소수 자릿수를 지정하는 동안 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();

답변

또 다른 옵션은 snprintf다음과 같습니다.

double pi = 3.1415926;

std::string s(16, '\0');
auto written = std::snprintf(&s[0], s.size(), "%.2f", pi);
s.resize(written);

데모 . 오류 처리를 추가해야합니다 (예 :written < 0.


답변

{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();
}