C ++不准确的计算

时间:2015-04-14 15:15:57

标签: c++

我在计算浮点数时得到了错误的答案。

float total =1;
        for(int i= 0; i<16;i++){
            total = total * floats_array[i];
            if(i!=15)
            cout << floats_array[i] << " * ";
            else
                cout << floats_array[i] << " = ";
        }
         cout << total << "\n";

编译器回答:

enter image description here

正确答案:

enter image description here

我需要3个数字才能指向。

任何建议?

3 个答案:

答案 0 :(得分:2)

您是否尝试打印最多三位小数?

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

int main() {
    vector< float > floats_array( 16, 1.123 );

    float total = 1;

    for(int i = 0; i<16;i++) {
         total = total * floats_array[i];
    }

    float rounded_total = std::floor( total * 1000 ) / 1000;
    cout << "total           = " << total << endl;
    cout << "total (rounded) = " << rounded_total << endl;

    return 0;
}

outputtotal = 6.398(而不是total = 6.39847)。

答案 1 :(得分:1)

默认情况下,浮点值的格式最多为六位有效小数。有操纵者可以改变这一点;得到三位小数,你想要

#include <iomanip>

std::cout << std::fixed << std::setprecision(3) << total;

对我来说,这会打印362955.656,你会注意到它仍然是不精确的:典型的32位float只能提供六位或七位小数的精度。使用double可获得更高的精确度;这给了我362955.533,正确到至少三位小数。

答案 2 :(得分:0)

从截图中看,您打印的值看起来像是从float转换为int,因为它正在向上舍入。我会检查您的阵列类型以及您的打印方式。如果没有更多代码,就无法获得更多细节。提供更好的MVCE以获得社区的更好答案。

您可以尝试使用类似

的内容覆盖cout
cout.precision(15);
cout << float_array[i];
cout << total;

这会将cout精度设置为15个位置。您可以将此数字更改为您想要的任何数字。