我在c ++中有一个浮点数,数字可以是不同的形式,例如: 355.5或9.9(这是测试代码的输入)。
我有一个
的功能float return_max(angle_set_t *angles)
{
float val;
float max;
max= angles->key;
while( angles != NULL )
{
val= angles->key;
if(max<=val)
{
max=val;
}
angles = angles->right;
}
return max;
}
max
可以是浮点值。我想将值四舍五入到一位小数。
我需要一个通用解决方案,因此适用于355.555555和9.999999
float first_aset()
{
//do somethig
result=return_max();
return result;
}
void main()
{
if( first_aset(S, 357.0, 20.0 ) != 9.9 ||
first_aset(T, 357.0, 20.0 ) != 9.9 )
{
printf("Error in wrap-around interval (3)\n");
printf(" first in interval [357, 20) in S is %f, should be 9.9\n",
first_aset(S, 357.0, 20.0 ) );
printf(" first in interval [357, 20) in T is %f, should be 9.9\n",
first_aset(T, 357.0, 20.0 ) );
}
}
这里是问题所在。结果是:
环绕间隔(3)
时出错首先在区间[357,20]中S是9.900000,应该是9.9
区间[357,20]中的第一个在T中是9.900000,应该是9.9
答案 0 :(得分:6)
做
answer = static_cast<float>(static_cast<int>(number * 10.)) / 10.;
如果您只是尝试以该精度显示值,请尝试setprecision:
cout << setprecision(1) << number << endl;
在你的代码中,你将float与double进行比较。这只会严重结束(任何浮点比较都会如此)。如果与9.9f
答案 1 :(得分:6)
必读:What Every Computer Scientist Should Know About Floating-Point Arithmetic
非科学家的简要说明:What Every Programmer Should Know About Floating-Point Arithmetic
答案 2 :(得分:4)
rounded = truncf(original * 10) / 10;
但是,我同意Ben的意见,你绝对不应该检查确切的不平等。如果需要进行比较,请使用epsilon。
答案 3 :(得分:0)
作为旁注,您似乎正在构建自己的(侵入性)链接列表。 C ++已经为您提供了各种容器,例如vector
和list
。此外,您不必编写确定序列中最大值的函数,只需使用标准库中的适当算法。
#include <vector>
#include <algorithm>
std::vector<float> angles = {0.0, 355.5, 9.9};
float maximum = *std::maximum_element(angles.begin(), angles.end());
答案 4 :(得分:0)
使用此功能,看起来很复杂,但这是要问的:
float float_one_point_round(float value)
{
return ((float)((int)(value * 10))) / 10;
}