# std::numeric_limits<T>::max_digits10

< cpp‎ | types‎ | numeric limits

static constexpr int max_digits10 |  | (C++11 起)

std::numeric_limits<T>::max_digits10 的值是唯一地表示所有类型 `T` 值的底 10 位数，是为序列化/反序列化到文本所需。此常量对所有浮点类型有意义。

### 标准特化

`T` | std::numeric_limits<T>::max_digits10 的值
/* non-specialized */ (C++11) | ​0​
bool (C++11) | ​0​
char (C++11) | ​0​
signed char (C++11) | ​0​
unsigned char (C++11) | ​0​
wchar_t (C++11) | ​0​
char8_t (C++20) | ​0​
char16_t (C++11) | ​0​
char32_t (C++11) | ​0​
short (C++11) | ​0​
unsigned short (C++11) | ​0​
int (C++11) | ​0​
unsigned int (C++11) | ​0​
long (C++11) | ​0​
unsigned long (C++11) | ​0​
long long (C++11) | ​0​
unsigned long long (C++11) | ​0​
float (C++11) | FLT_DECIMAL_DIG 或 std::ceil(std::numeric_limits<float>::digits * std::log10(2) + 1)
double (C++11) | DBL_DECIMAL_DIG 或 std::ceil(std::numeric_limits<double>::digits * std::log10(2) + 1)
long double (C++11) | DECIMAL_DIG 或 LDBL_DECIMAL_DIG 或 std::ceil(std::numeric_limits<long double>::digits * std::log10(2) + 1)

### 注解

不同于多数数学运算，只要用至少 `max_digits10` （对于 float 为 9 ，对于 double 为 17 ）位，则从浮点值转换到文本并转换回来是准确的：保证产生同一浮点值，即使不确定的文本表示不准确。以小数点记法，可能需要超过一百个十进制小数位表示 float 的精确值。

### 示例

    #include <limits>
    #include <sstream>
    #include <iomanip>
    #include <cmath>
    #include <iostream>

    int main()
    {
        float value = 10.0000086;

        constexpr auto digits10 = std::numeric_limits<decltype(value)>::digits10;
        constexpr auto max_digits10 = std::numeric_limits<decltype(value)>::max_digits10;
        constexpr auto submax_digits10 = max_digits10 - 1;

        std::cout
            << "float:\n"
            << "       digits10 is " << digits10 << " digits" << '\n'
            << "   max_digits10 is " << max_digits10 << " digits" << '\n'
            << "submax_digits10 is " << submax_digits10 << " digits" << '\n'
            << '\n';

        const auto original_precision = std::cout.precision();
        for( auto i = 0; i < 5; ++i )
        {
            std::cout
                << "   max_digits10: " << std::setprecision(max_digits10) << value << '\n'
                << "submax_digits10: " << std::setprecision(submax_digits10) << value << '\n'
                << '\n';

            value = std::nextafter( value, std::numeric_limits<decltype(value)>::max() );
        }
        std::cout.precision( original_precision );

        return 0;
    }

输出：

    float:
           digits10 is 6 digits
       max_digits10 is 9 digits
    submax_digits10 is 8 digits

       max_digits10: 10.0000086
    submax_digits10: 10.000009

       max_digits10: 10.0000095
    submax_digits10: 10.00001

       max_digits10: 10.0000105
    submax_digits10: 10.00001

       max_digits10: 10.0000114
    submax_digits10: 10.000011

       max_digits10: 10.0000124
    submax_digits10: 10.000012

### 参阅

radix [静态] | 给定类型的表示所用的基或整数底 (公开静态成员常量)
digits [静态] | 能无更改地表示的 `radix` 位数 (公开静态成员常量)
digits10 [静态] | 能无更改地表示的十进制位数 (公开静态成员常量)
min_exponent [静态] | 底的该数次幂是合法正规浮点值的最小负数加一 (公开静态成员常量)
max_exponent [静态] | 底的该数次幂是合法有限浮点值的最大整数加一 (公开静态成员常量)