课程首页 › 第3部分 › 第36课

第36课 小数位数的纠结

第3部分 不辞辛苦 · 循环结构· 知识点:while循环、小数位数

小数位数的纠结(while循环、小数位数)

插图

一说起C++的除法,就让人纠结,怎么对小数的约束那么多呀!

整数相除没小数:1/3=0。

浮点数相除小数位数因为输出受限了:1.0/3=0.333333。

调整输出位数cout<<fixed<<setprecision(20)<<1.0/3,可结果竟然是0.33333333333333331483。

插图

小数位数

把每步相除都拆开,输出商,余数乘10继续除,然后不断将商拼接起来。

例如:

插图

(1)1÷3商为0,输出商,此时输出结果为0。

(2)接下来是小数部分,输出.,此时的输出结果为0.。

①余数乘以10继续除,余数为1,1×10=10,10÷3的商为3,此时输出结果为0.3。

②余数为1,继续循环,输出结果为0.33

将商不断输出并拼接即可。

提出思考

为什么余数要乘10呢?

在这个程序中,余数乘以10是为了将小数点右侧的数字逐位计算出来。这样的回答可能有些抽象,想一想正常除法是怎么计算的。

插图

再继续除下去也是一样的,一直变10继续除。

插图
插图

运行程序:

请输入被除数:20

请输入除数:3

请输入计算结果的小数位数:10

计算结果为:6.6666666666

(1)排除除数为0的情况。

插图

(2)先将商的整数部分输出numerator / denominator。

插图

(3)考虑小数位数的情况,如果计算结果需要的小数位数大于0,记得输出小数点。

插图

(4)根据输入的小数位数precision,设计循环次数将小数部分输出。

①remainder*=10:将余数乘以10,进入下一次除法计算。

②int quotient=remainder / denominator:将乘以10后的余数除以除数,得到商。

③cout<<quotient:将商输出组合成新数字

④remainder=remainder % denominator:获取下一个余数。

⑤precision--:小数位数减1,直到为0,跳出循环。

以1÷3为例:

插图
插图

思考提问——四舍五入

20÷3的输出结果是6.6666666666,没有进位,如何四舍五入呢?

需要调整一下计算结果的输出,当(precision==0)时,也就是在输出最后一位小数前,往后再计算一位,如果后一位的值大于或等于5,则让quotient + 1后再输出。

插图
插图

巩固练习

(1)在while循环中,循环体至少要执行几次?()

A.0次

B.1次

C.无法确定

D.无限次

(2)阅读以下代码,填写输出结果。

插图

运行程序,输入2023999666,会输出什么?

输出:_____________________________________________________________ _______

(3)编写一个C++程序,接收用户输入的一个具有10位小数的正浮点数和一个整数n,然后输出该浮点数中的第n位小数。

程序应该不断地将输入的浮点数乘以10,直到达到第n位小数,然后将该小数值输出给用户,以显示浮点数中的第n位小数是多少。

示例输入:

请输入一个10位小数的正浮点数:123.4567890123

取第几(1~10)位中的一个小数:4

示例输出:

浮点数中的第4位小数为:7