浮点数计算
一 背景
起因是自己计算两个整型数据的比值,然后用浮点型数据接收。
写法是这样的。
int a = 12;
int b = 15;
float c = a / b;
由此引起的这篇文章
二、浮点型计算
上面的代码的计算结果是这样的
cout << c << endl; //打印结果是0
printf("%f\n", c); //打印结果是0.000000
如果要实现正确的计算结果,需要写成下面的方式
float c = (float)a / b;
然后疑问是为什么要强制类型转换一下。然后在写的过程中突然想到的原因是:
整型计算得到的结果还是整型。当将a强制转换成浮点型的时候,变成了整型和浮点型之间的计算,计算结果就是浮点型。
而对于c++的cout打印,不需要像c语言那样需要写格式控制符。比如写成下面的形式就可以正常打印浮点型数据。
float c = 2.34;
cout << c << endl; //打印结果2.34
三、引申
3.1 cout控制字符宽度
std::setw(2) << std::setfill('0') //控制输出宽度为2,不够补0
3.2 除法运算需要注意除数不能为0
取余除数也不可以为0
4 浮点型数据比较大小
#include <iostream>
#include <cmath>
bool IsEqual(double a, double b)
{
return (std::fabs(a - b) <= std::numeric_limits<double>::epsilon());
}
void Compare(double f)
{
if (IsEqual(f, 3.14)) { // 符合
printf("is Equal");
} else {
printf("is not Equal");
}
}
int main()
{
double t = 3.14;
Compare(t);
return 0;
}
// float同理
对于下面这种情况组要注意,
判断值是否等于66.66的语句如下
if (std::fabs(realParamGreenLightLength.paramValue - 66.66) <= std::numeric_limits<float>::epsilon()) {
printf("equal");
}
会出现不打印equal的情况,改成下面的情况就行了
if (std::fabs(realParamGreenLightLength.paramValue - 66.66f) <= std::numeric_limits<float>::epsilon()) {
printf("equal");
}
下面是验证代码
void floatTypeCompareVerify()
{
float paramValue = 66.66f;
if (std::fabs(paramValue - 66.66) <= std::numeric_limits<float>::epsilon()) {
printf("1 equal\n");
} else {
printf("1 not equal\n");
}
if (std::fabs(paramValue - 66.66f) <= std::numeric_limits<float>::epsilon()) {
printf("2 equal\n");
} else {
printf("2 not equal\n");
}
}
打印结果
1 not equal
2 equal