第36课 小数位数的纠结
小数位数的纠结(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