我有这样一行简单的代码:
float val = 123456.123456;
当我打印这个值或查看作用域时,它存储的值为123456.13。
好吧,这是可以理解的,它不能在只有4个字节的情况下存储小数点后面的所有数字,但为什么它会变成小数点后13位呢?难道不应该是12位吗?
(使用vc++ 2010 express在win32上)
我有这样一行简单的代码:
float val = 123456.123456;
当我打印这个值或查看作用域时,它存储的值为123456.13。
好吧,这是可以理解的,它不能在只有4个字节的情况下存储小数点后面的所有数字,但为什么它会变成小数点后13位呢?难道不应该是12位吗?
(使用vc++ 2010 express在win32上)
123456.123456在二进制下是11110001001000000.000111111001...(无限)它四舍五入为11110001001000000.001,即123456.125。 这个数 在打印时四舍五入为123456.13。
val
存储的值等于123456.125
。你得到了.13
是因为进行了四舍五入处理:
float val = 123456.123456;
printf("%.4f %.2f\n", val, val);
输出:123456.1250 123456.13
在这种情况下,应该使用double以避免截断。编译器也应该警告你:"warning C4305: 'initializing' : truncation from 'double' to 'float'"。
当以浮点数表示时,您的数字具有16的指数(即该值为其尾数乘以2 ^ 16或65536)。然后,尾数变为
123456.123456 / 65536 = 1.8837909462890625
1.883791
。当乘以65536
后,它变成123456.125
。5
:你使用的C++输出例程将其四舍五入,使得最终数字看起来像是123456.13
。printf
中转换为十进制。存储值为1.1110001001000000001 x 2^16 = 1.8837909698486328125 x 2^16 = 123456.125。它打印为123456.13,但只是因为Visual C++使用“从零开始向上四舍五入”的舍入方式。std::numeric_limits<float>::digits10
的值。这大致表示浮点数在十进制中具有多少精度。您正在尝试超出它,因此会出现精度损失(这意味着重要数字之外的数字实际上并不重要)。这完全取决于编译器。在GCC中检查它。应该是xxx.12。