这是我的代码:
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
答案 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)
在我看来就像overflow。 pow(10.0,decPlace) * number
是一个非常大的数字 - 太大而不适合32位整数(这可能是你平台上的int
)。