今天在python123刷题,有这样一道题:
二分法求平方根B
描述
设计一个用二分法计算一个大于或等于 0 的实数 n 的平方根的函数sqrt_binary(n),实数 n和计算精度(abs(x*x - n) )控制由用户在同一行内输入,用逗号进行分隔,输出结果保留8位小数。
注:初始区间取[0,n+0.25]
输入格式
在同 行内输入一个实数 n(大于或等于0)和一个代表精度的数字(可用1e-m格式输入)
输出格式
第一行输出用自己设计的函数计算得到的平方根
第二行输出用math库开平方函数计算得到的平方根
输入输出示例
输入 | 输出 | |
示例 1 | 5.0,1e-7 | 2.23606796 2.23606798 |
我的代码:
import math
def f(n,precision):
low = 0
heigh = n+0.25
medin = (low+heigh)/2
while abs(medin*medin-n)>precision:
if medin*medin<n:
low = medin
else:
heigh = medin
medin = (low+heigh)/2
return round(medin,8)
list1 = input().split(",")
n = float(list1[0])
precision = float(list1[1])
print(f(n,precision))
print("%.8f"%math.sqrt(n))
结果有一个测试点死活过不了:
最后发现,问题出在round()函数:
调用round()时,四舍五入并不会保留占位的0(包括尝试了format()方法也是这样):
a = 1.20000
print(round(a,4))
print("{:.4}".format(a))
# 输出:1.2
# 1.2
(难怪,也许这个测试点的数据小数点后八位末尾含零,自然不满足输出格式)
而当采用print(”%.8f“%)时,顺利通过,测试发现:
a = 1.20000
print("%.4f"%a)
# 输出:1.2000
总结:
使用round()、format()方式取小数位数时不会保留末尾占位0
使用如print(”%.8f“%)方式取小数位数时才会保留末尾占位0
(注:以上仅为对个人学习中所遇问题的思考与记录)