1. ホーム
  2. c++

[解決済み] C++、科学的記数法、フォーマット番号

2022-03-03 22:54:55

質問

科学的記数法の文字列を以下のようにフォーマットすることは可能ですか。

  • 指数部の固定位置を設定:1

  • 仮数の小数点以下の桁数を設定: 0

     double number = 123456.789
    
    

だから、数字はフォーマットされるべきです

  1e+5

仮数に小数点以下0桁を設定できません。

cout.precision(0);
cout << scientific << number;

の結果です。

1.234568e+005

解決方法は?

CやC++の標準では、指数は最低2桁で、g++もそうなっています。 標準のCやC++のI/O関数を使っても1桁にしかならないので、自分で解決する必要があります。 浮動小数点から文字列への変換を行うのは 非常に厄介な問題 [PDF]にあるように、そのようなことはせず、代わりに結果を後処理することを強くお勧めします。

その方法のひとつを紹介します。

// C version; you can rewrite this to use std::string in C++ if you want
void my_print_scientific(char *dest, size_t size, double value)
{
    // First print out using scientific notation with 0 mantissa digits
    snprintf(dest, size, "%.0e", value);

    // Find the exponent and skip the "e" and the sign
    char *exponent = strchr(dest, 'e') + 2;

    // If we have an exponent starting with 0, drop it
    if(exponent != NULL && exponent[0] == '0')
    {
        exponent[0] = exponent[1];
        exponent[1] = '\0';
    }
}