在C ++中将数字显式舍入到超过7位小数

时间:2009-11-08 14:12:37

标签: c++ numbers rounding

这是我的代码:

double round( char* strNumber, int decPlace);

int main()
{
    int decimal;
         char initialNumber[256];

    cout << "Enter decimal and number " << endl;

    cin >> decimal;
    cin >> initialNumber;

    cout << setprecision (15) << round ( initialNumber,decimal ) << endl;   

return 0;
}

double round( char* strNumber, int decPlace)//
{
    double number = atof(strNumber);
    int temp = ( int ) ( pow(10.0,decPlace) * number + 0.5 );
    double result = ( double ) temp / pow(10.0,decPlace);
    return result;
}

最多可以工作6位小数。否则会产生一些奇怪的结果。以下是我用于测试和输出的数字:

测试1轮到7位小数

105.265

52.5689745694

25.6835

452.689785

12.456789877458

输出

105.265

52.5689746

25.6835

-214.7483648

12.4567899

测试1轮到8位小数

与之前相同的数字

输出

-21.47483648

-21.47483648

-21.47483648

-21.47483648

12.45678988

4 个答案:

答案 0 :(得分:6)

正如其他人所说,对int的强制转换不适用于大数。您可以考虑使用floor代替,并将数字保持在double中的四舍五入:

#include <cstdlib>
#include <cmath>

double round( char* strNumber, int decPlace)
{
    double number = std::atof(strNumber);
    double expo = std::pow(10.0,decPlace);
    return std::floor( expo * number + 0.5) / expo;
}

答案 1 :(得分:3)

int可以保持比double更小的范围;在许多平台上,它的最大值大约为20亿,对于大多数输入数字而言小于pow(10.0,8) * number

您可以将您的号码保留为double,并使用floor向下舍入为整数:

double temp = floor( pow(10.0,decPlace) * number + 0.5 );
double result = temp / pow(10.0,decPlace);

答案 2 :(得分:1)

int temp = ( int ) ( pow(10.0,decPlace) * number + 0.5 );

temp可能是32位。它可以容纳大约+ - 20亿。溢出。

答案 3 :(得分:1)

在我看来就像overflowpow(10.0,decPlace) * number是一个非常大的数字 - 太大而不适合32位整数(这可能是你平台上的int)。