通貨の金額と価格を目的として、コード内のdoubleをg++のstd::decimal ::decimal32 / 64/128タイプに置き換えることを調査していますが、最適な入出力方法の点で立ち往生しています。データ。具体的には、文字列との間で変換するためのルーチンはないようであり、文字列ストリームメカニズムはこれらのタイプ用にコンパイルされません。これを行う唯一の方法は、中間型としてdoubleを使用することですが、常にdoubleを介して入力および出力する場合、これは10進数型を使用する目的を少なくとも部分的に無効にしますか?
私はここで何かを理解していないと確信しているので、これらのタイプの最適な使用方法に関するフィードバックを歓迎します。
編集:
私はいくつかの入出力ルーチンを一緒にハックしましたが、どちらにも本当に満足していません。入力はほとんど堅牢ではなく(科学的記数法のサポートなし)、出力ルーチンは単純化されており、二重変換のために非効率的であることは言うまでもありません。
#define MAX_DEC_LEN 17
std::decimal::decimal64 FromString(const char* str)
{
if (strlen(str) > MAX_DEC_LEN)
throw std::runtime_error("bad input");
char buf[MAX_DEC_LEN+1];
strncpy(buf, str, MAX_DEC_LEN+1);
char* point(NULL);
if ((point = strchr(buf, '.')) != NULL)
*(point++) = '\0';
std::decimal::decimal64 ret(atoi(buf));
if (point != NULL && *point != '\0')
{
int exponent(strlen(point));
long long unsigned coeff(atoi(point));
std::decimal::decimal64 d2(std::decimal::make_decimal64(coeff, -exponent));
if (*buf == '-')
ret -= d2;
else
ret += d2;
}
return ret;
}
std::string ToString(std::decimal::decimal64 dec)
{
double d(std::decimal::decimal_to_double(dec));
std::ostringstream oss;
oss << std::fixed << std::setprecision(6) << d;
return oss.str();
}
私は本当にこれらの両方のために何かより良いものを求めています、そして物事を丸めるための(特定の精度への)ラウンド(しゃれを許してください)