float-double

C语言中float和double的精度问题

总体原则

  • printf("%3.0f",floatNum):不保留小数

说明:%3.0f表明待打印的浮点数(floatNum)至少占3个字符宽,且不带小数点和小数部分,整数部分至少占3个位宽;

注意:这里的3只代表整数部分至少占3位,舍弃小数点和小数点后面的部分

  • printf("%6.2f".floatNum):保留两位小数

说明:%6.2f 表明待打印的数(floatNum)至少占6个字符宽度(包括两位小数和一个小数点),且小数点后面有2位小数,小数点占一位,所以整数部分至少占3位。

注意:这里的6是待打印的数至少占据的字符宽度,包括两位小数(如果小数不够两位用0补位,例如100.1打印出来为100.10)和一个小数点,所以整数部分至少占3个字符宽度。

  • 单精度实数的有效位数一般为7位,输出6位小数,超出有效位数输出就是错误的。

  • 双精度数有效位数一般为16位,输出6位小数,超出有效位数可能截断或错误值。

保留小数点后有效位数四舍五入原则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
double a = 0.2;
double b = 0.4;

double c = a + b;
double d = a - b;

cout << "a + b = " << c << endl;
cout << "a - b = " << d << endl;

printf("%lf\n", a);
printf("%lf\n", c);

// 不保留小数
printf("%f\n", 100.00);
printf("%.0f\n", 100.00);
printf("\n");

// 不保留小数
printf("%f\n", 100.30);
printf("%.0f\n", 100.30);
printf("\n");

// 不保留小数,四舍五入
printf("%f\n", 100.50);
printf("%.0f\n", 100.50);
printf("\n");

// 保留一位小数
printf("%f\n", 100.53);
printf("%.1f\n", 100.53);
printf("\n");

// 保留一位小数,没有四舍五入
printf("%f\n", 100.55);
printf("%.1f\n", 100.55);
printf("\n");

// 保留1位小数,四舍五入
printf("%f\n", 100.56);
printf("%.1f\n", 100.56);
printf("\n");

// “四舍六入五留双”。 GCC用的正是这种
printf("%f\n", 100.563);
printf("%.2f\n", 100.563);
printf("\n");

printf("%f\n", 100.565);
printf("%.2f\n", 100.565);
printf("\n");

printf("%f\n", 100.566);
printf("%.2f\n", 100.566);
printf("\n");

return 0;
}
  • 输出
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    a + b = 0.6
    a - b = -0.2
    0.200000
    0.600000
    100.000000
    100

    100.300000
    100

    100.500000
    100

    100.530000
    100.5

    100.550000
    100.5

    100.560000
    100.6

    100.563000
    100.56

    100.565000
    100.56

    100.566000
    100.57

0%