当前位置 : 主页 > 编程语言 > python >

BEGIN-3 圆的面积

来源:互联网 收集:自由互联 发布时间:2022-06-18
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定圆的半径r,求圆的面积。 输入格式 输入包含一个整数r,表示圆的半径。 输出格式 输出一行,包含一个实数,四舍五入保留小


资源限制

时间限制:1.0s 内存限制:256.0MB

问题描述

给定圆的半径r,求圆的面积。

输入格式

输入包含一个整数r,表示圆的半径。

输出格式

输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积。

说明:在本题中,输入是一个整数,但是输出是一个实数。

对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不行的,都会被认为错误。

实数输出的问题如果没有特别说明,舍入都是按四舍五入进行。

样例输入

4

样例输出

50.2654825

数据规模与约定

1 <= r <= 10000。

​提示​

本题对精度要求较高,请注意π的值应该取较精确的值。你可以使用常量来表示π,比如PI=3.14159265358979323,也可以使用数学公式来求π,比如PI=atan(1.0)*4。

Code

Python

import math


r = int(input())
area = math.pi * r * r
print("%.7f" % area)

这里有一个小坑,取小数点后七位数字,用round()函数就不行。

BEGIN-3 圆的面积_python

这道题比较简单,我们可以做一个对数器检验一下:

import math


if __name__ == '__main__':
for r in range(1000):
area = math.pi * r * r
if str(round(area, 7)) != "%.7f" % area:
print(str(round(area, 7)))
print("%.7f" % area)
break

这一试就试出来结果了:

0.0
0.0000000

现在我们就知道了,round()函数会对后缀零做截断处理,比如说:

BEGIN-3 圆的面积_git_02

对3.140000取小数点后三位的时候只会保留3.14,舍去最后的零。

round()函数小坑

​1、round的结果跟python版本有关​

来看看python2和python3中round()函数有什么不同:

BEGIN-3 圆的面积_python_03

BEGIN-3 圆的面积_浮点数_04

在python2.7的doc中,round()的最后写着,“Values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done away from 0.”

保留值将保留到离上一位更近的一端(四舍六入),如果距离两端一样远,则保留到离0远的一边。

所以round(0.5)会近似到1,而round(-0.5)会近似到-1。

但是到了python3.5的doc中,文档变成了“values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice.”

如果距离两边一样远,会保留到偶数的一边。

比如round(0.5)和round(-0.5)都会保留到0,而round(1.5)会保留到2。

​2、特殊数字round出来的结果可能未必是想要的​

BEGIN-3 圆的面积_浮点数_05

round(2.675, 2) 的结果,不论我们从python2还是3来看,结果都应该是2.68的,结果它偏偏是2.67,为什么?

这跟浮点数的精度有关。

我们知道在机器中浮点数不一定能精确表达,因为换算成一串1和0后可能是无限位数的,机器已经做出了截断处理。

那么在机器中保存的2.675这个数字就比实际数字要小那么一点点。

这一点点就导致了它离2.67要更近一点点,所以保留两位小数时就近似到了2.67。

​除非对精确度没什么要求,否则尽量避开用round()函数。​

近似计算我们还有其他的选择:

使用math模块中的一些函数,比如math.ceiling(天花板除法)。

python自带整除,python2中是/,3中是//,还有div函数。

字符串格式化可以做截断使用。

当然,对浮点数精度要求如果很高的话,请用decimal模块。



上一篇:BEGIN-4 Fibonacci数列
下一篇:没有了
网友评论