Namespaces
Variants

std::numeric_limits<T>:: digits10

From cppreference.net
Utilities library
static const int digits10 ;
(C++11 前)
static constexpr int digits10 ;
(C++11 起)

std:: numeric_limits < T > :: digits10 的值表示类型 T 可无损表示的十进制位数,即任何具有该有效十进制位数的数值均可转换为 T 类型值并还原为十进制形式,且不会因舍入或溢出而改变。对于基数为 radix 的类型,其值为 digits() (浮点类型为 digits - 1 )乘以 log 10 (radix) 后向下取整的结果。

标准特化

<td
T std:: numeric_limits < T > :: digits10 的值
/* non-specialized */ 0
bool 0
char std:: numeric_limits < char > :: digits * std:: log10 ( 2 )
signed char std:: numeric_limits < signed char > :: digits * std:: log10 ( 2 )
unsigned char std:: numeric_limits < unsigned char > :: digits * std:: log10 ( 2 )
wchar_t std:: numeric_limits < wchar_t > :: digits * std:: log10 ( 2 )
char8_t (C++20 起) std:: numeric_limits < char8_t > :: digits * std:: log10 ( 2 )
char16_t (C++11 起) std:: numeric_limits < char16_t > :: digits * std:: log10 ( 2 )
char32_t (C++11 起) std:: numeric_limits < char32_t > :: digits * std:: log10 ( 2 )
short std:: numeric_limits < short > :: digits * std:: log10 ( 2 )
unsigned short std:: numeric_limits < unsigned short > :: digits * std:: log10 ( 2 )
int std:: numeric_limits < int > :: digits * std:: log10 ( 2 )
unsigned int std:: numeric_limits < unsigned int > :: digits * std:: log10 ( 2 )
long std:: numeric_limits < long > :: digits * std:: log10 ( 2 )
unsigned long std:: numeric_limits < unsigned long > :: digits * std:: log10 ( 2 )
long long (C++11 起) std:: numeric_limits < long long > :: digits * std:: log10 ( 2 )
unsigned long long (C++11 起) std:: numeric_limits < unsigned long long > :: digits * std:: log10 ( 2 )
float

示例

一个8位二进制类型可以精确表示任意两位十进制数,但无法表示三位十进制数256..999。8位类型的 digits10 值为2( 8 * std:: log10 ( 2 ) 的结果为2.41)

标准的32位IEEE 754浮点类型具有24位小数部分(23位显式表示,1位隐含位),这可能暗示其可表示7位十进制数( 24 * std:: log10 ( 2 ) 等于7.22)。但由于相对舍入误差的非均匀性,部分具有7位十进制数字的浮点值在转换为32位float并返回时无法保持原值:最小的正例是 8.589973e9 ,在往返转换后变为 8.589974e9 。这些舍入误差在表示中不会超过1比特, digits10 的计算公式为 ( 24 - 1 ) * std:: log10 ( 2 ) ,即6.92。向下取整后得到值为6。

同样地,16位数字串 9007199254740993 无法在 文本->双精度->文本 的往返过程中保持原值,会变成 9007199254740992 :64位 IEEE 754 双精度类型仅能保证15位十进制数字的往返精度。

参见

[static] (C++11)
区分此类型所有值所需的十进制位数
(公开静态成员常量)
[static]
给定类型表示所使用的基数或整数基底
(公开静态成员常量)
[static]
可无更改表示的 radix 数字位数
(公开静态成员常量)
基数的最小负幂加一,该幂是有效的规范化浮点值
(公开静态成员常量)
基数的最大整数幂加一,该幂是有效的有限浮点值
(公开静态成员常量)