正确选择数据类型
2014-11-11 20:59
218 查看
在C语言编程时,必须正确选择计算过程中使用的变量类型。如果使用了错误的变量类型,程序很难检测出错误所在,同时也会造成计算结果与我们期望得到的结果有所偏差。举一个简单的例子。
/*****************************************************
函数功能:测试数据类型对处理结果的影响,以及使用
显示强制类型转换。
*****************************************************/
#include<stdio.h>
int main(void)
{
const float Revenue_Per_150=4.5f;//每150件商品售价
short JanSold=23500;//一月份售出商品
short FebSold=19300;//二月份售出商品
short MarSold=21600;//三月份售出商品
float RevQuarter=0.0f;//第一季度收益
long QuarterSold=JanSold+FebSold+MarSold;//第一季度售出商品总数
RevQuarter=QuarterSold/150*Revenue_Per_150;
printf("Stock sold in \n Jan: %d\n Feb: %d\n Mar: %d\n",JanSold,FebSold,MarSold);
printf("Total stock sold in first quarter: %ld\n",QuarterSold);
printf("Sales revenue this quarter if: $%.2f\n",RevQuarter);
return 0;
}
运行结果如下:
程序计算结果:1930.50,而通过实际的计算我们得到真正的结果应该是1932.00。那么问题来了,这中间相差的1.50跑哪儿去了?虽然这是一个很小的数据,但是差之毫厘谬以千里,这也会给我们造成很大的麻烦。
那么好,我们来看一下具体的处理过程:
在语句 RevQuarter=QuarterSold/150*Revenue_Per_150;中我们根据计算规则来一步一步分析。
首先计算QuarterSold/150,即64400/150,得到的结果是429.333,这里64400是长整型,150是整形,两个整形相除得到的结果是整数,所以小数点后面的数据去掉,得到结果429
第二步再计算乘法:429*Revenue_Per_150。这里Revenue_Per_150是浮点数,得到的最终结果也是浮点数1930.50。
这就是错误所在。
知道了错误怎么改正呢?其实很简单让式子以浮点数运算就可以了。
修改函数体内语句为:RevQuarter=(float)QuarterSold/150*Revenue_Per_150;
对第一步的计算进行强制数据转换即可。这时是显示转换。
运行结果为:
此时就得到我们期望的值了。消失的1.50已经找到。
其实在修改函数语句时也可以进行隐式转换,即:RevQuarter=QuarterSold/150.0f*Revenue_Per_150;
不过还是建议使用显示转换,利于程序可读性以及以后错误检查。
/*****************************************************
函数功能:测试数据类型对处理结果的影响,以及使用
显示强制类型转换。
*****************************************************/
#include<stdio.h>
int main(void)
{
const float Revenue_Per_150=4.5f;//每150件商品售价
short JanSold=23500;//一月份售出商品
short FebSold=19300;//二月份售出商品
short MarSold=21600;//三月份售出商品
float RevQuarter=0.0f;//第一季度收益
long QuarterSold=JanSold+FebSold+MarSold;//第一季度售出商品总数
RevQuarter=QuarterSold/150*Revenue_Per_150;
printf("Stock sold in \n Jan: %d\n Feb: %d\n Mar: %d\n",JanSold,FebSold,MarSold);
printf("Total stock sold in first quarter: %ld\n",QuarterSold);
printf("Sales revenue this quarter if: $%.2f\n",RevQuarter);
return 0;
}
运行结果如下:
程序计算结果:1930.50,而通过实际的计算我们得到真正的结果应该是1932.00。那么问题来了,这中间相差的1.50跑哪儿去了?虽然这是一个很小的数据,但是差之毫厘谬以千里,这也会给我们造成很大的麻烦。
那么好,我们来看一下具体的处理过程:
在语句 RevQuarter=QuarterSold/150*Revenue_Per_150;中我们根据计算规则来一步一步分析。
首先计算QuarterSold/150,即64400/150,得到的结果是429.333,这里64400是长整型,150是整形,两个整形相除得到的结果是整数,所以小数点后面的数据去掉,得到结果429
第二步再计算乘法:429*Revenue_Per_150。这里Revenue_Per_150是浮点数,得到的最终结果也是浮点数1930.50。
这就是错误所在。
知道了错误怎么改正呢?其实很简单让式子以浮点数运算就可以了。
修改函数体内语句为:RevQuarter=(float)QuarterSold/150*Revenue_Per_150;
对第一步的计算进行强制数据转换即可。这时是显示转换。
运行结果为:
此时就得到我们期望的值了。消失的1.50已经找到。
其实在修改函数语句时也可以进行隐式转换,即:RevQuarter=QuarterSold/150.0f*Revenue_Per_150;
不过还是建议使用显示转换,利于程序可读性以及以后错误检查。
相关文章推荐
- 如何正确选择MySQL数据列类型
- ORACLE-在设计数据库时如何选择正确的数据类型
- [转]oracle设计数据库应选择正确的数据类型
- textBOX验证控件,自动验证数据正确与否!只需选择你的数据类型
- 选择正确的数据类型
- MySQL基础教程4 —— 数据类型之存储需求及如何选择正确的类型
- 选择合适的数据类型
- PL/SQL 中如何正确选择游标类型
- Oracle 数据类型 选择自 tjandy 的 Blog
- Effective C# 原则7: 选择恒定的原子值类型数据(译)
- Delphi DBGrid数据导出到excel时,出现不正确的变量类型,怎么回事啊?
- 用enum类型数据解决switch case选择字符串的问题
- PL/SQL 中如何正确选择游标类型
- sql选择数据类型的参考
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
- 修改数据表DataTable某一列的类型和记录值(正确步骤:1.克隆表结构,2.修改列类型,3.修改记录值,4.返回希望的结果)
- Mysql 选择合适的数据类型
- 选择正确的嵌入式操作系统类型
- 选择正确的嵌入式操作系统类型
- [转]Effective C# 原则7: 选择恒定的原子值类型数据