android float类型保留两位小数_C语言快速入门——强制类型转换

我们已经能够使用数组进行一些数据统计工作了,就像前面求学生成绩平均值一样,唯一的一点缺陷就是结果没有精确度,比如说我们可能需要精确到小数点后两位。这是因为我们使用的是整形数组,如果将数组类型定义为float型,那一切就得以解决。

740d7458d21fac31c00544e58bd762c9.png
a0e0f68a219da2222f9a0a3a6d016eeb.png

程序使用了我们前面介绍的各种知识,流程已经很容易理解了,需要注意的是,输出成绩时我们使用了%.2f而不是%f,这表示保留小数点后两位并且执行四舍五入操作,32位环境下浮点数最高精度通常是小数点后6位。

有一些背后的内容需要我们思考。首先,我们说过数组存储的是同一数据类型的值的集合,这里定义了float型数组,但每个数据初始化时却给予了一个int型字面常量。最后的平均成绩是sum/count,这是一个float型除以int型的运算。这一切得以正确运转,得益于C语言提供的类型转换,在这里确切的说是自动类型转换。

类型转换

当一个表达式中的几个操作数类型不同时,就需要通过一些规则把它们转换为某种共同的类型来进行最终的求值。一般来说,自动转换是指把“比较窄的”的操作数转换为“比较宽的”操作数,并且不丢失信息的转换。这里宽窄是指用sizeof计算的数据类型的占用字节数。

例如,一个char类型变量与一个int类型变量相加,由于char类型本质上是小整型,它比int类型窄,即sizeof(char)小于sizeof(int),因此会自动的转换为两个int型变量相加。这种同类型(在这里都是整型类型)之间的转换会自动发生,也称为隐式转换。 当一个int类型的变量与一个float类型的变量相加时,它们的宽度相同,但是由于float类型是比int类型更高等级的类型,因此int类型会转型为float类型,表达式结果将是float类型。

强制类型转换

有时候你可能需要将较宽的数据类型转换为较窄的数据类型,或在两种不同的数据类型之间进行转换。这时可以使用显示的类型转换语法:(目标类型)变量。

e68579f42d5166510262af44891443e4.png

程序运行的结果是c=115, d=116,在求c的过程中a与b各自被转换为int型,这种转换并不会发生舍入操作,因此相当于求表示式45+70的值。而在求d的过程中,是先利用小括号的优先级,计算两个float的和,然后将其转换为int型。

提示:你可以根据我们学过的调试技巧,将a+b的结果监视一下,看看值是多少,以便更好的理解d的值为什么是116。

数值溢出

当从较宽的数据类型转换到较窄的数据类型时,在现代编译器上,这可以自动完成。但是,由于较宽数据类型存储的数值可能会超过较窄数据类型的范围,因此会发生不易发觉的逻辑错误。因此这种情况下建议显示的使用类型转换,以达到强调作用:我强制将大类型转换为小类型,可能会引发数值溢出错误(以后会详细讲解)!这样,下次有人阅读你的代码时,他看到强制类型转换时就会引发敏感性,这样做会不会引发什么问题?

5ebb6165dbfd70c4a85786fd4cbf33c6.png
6f7b7864e9a38f76bab3b0f22ecba7a6.png

这段代码使用了/* ... */的方式来注解程序,这是C提供的段落式注释方式,段注释是不能嵌套的;我们以前用的//称为行注释。

关于数据溢出的另一个理解方式:假设有两个盒子AB,A可以装4个苹果,B则只能装1个。你可以很轻松的把B中的1个苹果放进A中,但只能把A中的1个放进B中,其余的只能找其它盒子了。这些多出的苹果可以看做是溢出的。

现在继续回到求平均值的示例上来,你可以尝试将数组scores与变量sum声明为int型,使用强制类型转换来达到同样的目的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值