使用%f c ++打印正确的小数点数

时间:2016-10-19 22:13:26

标签: c++

我正在尝试打印一个最多5个小数位的数字。

我有:

#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    float a = 987.65;
    float b = 1.23456789;
    scanf("%f %f", &a, &b);
    printf("%.5f %.5f", a, b);
    return 0;
}

我得到的结果是987.65000和1.23456 我希望结果是987.65和1.23456,所以基本上我想在答案中最多5个,即<= 5个十进制数字。

3 个答案:

答案 0 :(得分:4)

稍微不那么技术性的方法是使用setprecision,如下所示:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    float a = 987.65;
    float b = 1.23456789;

    cout << setprecision(5);
    cout << a << " " << b << endl;

    return 0;
}

输出:

987.65 1.2346

答案 1 :(得分:1)

根本问题是计算机无法准确表示大多数浮点数。

此外,您需要一个复杂的格式规则:如果结束数字为零,则打印空格

问题是您的号码987.65000可能表示为98.6500001,因此不能使用您的格式规则。

我相信您必须编写自己的格式化功能才能实现您正在寻找的功能。

答案 2 :(得分:0)

这是一个可以满足您需求的解决方案:

#include <iostream>
#include <cstdio>
using namespace std;

unsigned int numPlaces = 5; //number of decimal places

unsigned int determinePlaces (float number) {
    unsigned int myPlaces = 0;
    while (number != (int)(number) && myPlaces<=numPlaces-1) {
        number = number*10;
        myPlaces++;
    }
    return myPlaces;
}

int main() {
    float a = 987.65;
    float b = 1.23456789;

    printf("%.*f %.*f\n", determinePlaces(a), a, determinePlaces(b), b);
    return 0;
}

输出:

987.65 1.23457

基本上,代码继续将山羊乘以10,直到转换为整数(基本上取底值)与浮点数匹配。如果它在达到第五次乘以10时没有,我们用printf的5位小数来满足自己。否则,我们会打印匹配楼层值所需的金额。