• BEGIN-3 圆的面积


    资源限制

    时间限制: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()函数就不行。

    在这里插入图片描述
    这道题比较简单,我们可以做一个对数器检验一下:

    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()函数会对后缀零做截断处理,比如说:

    在这里插入图片描述
    对3.140000取小数点后三位的时候只会保留3.14,舍去最后的零。

    round()函数小坑

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

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

    在这里插入图片描述

    在这里插入图片描述

    在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出来的结果可能未必是想要的

    在这里插入图片描述

    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模块。

  • 相关阅读:
    JAVA后端方面,如何快速达到能实习的程度
    如何高效地把Spring boot学到能干活的程度
    零高并发项目经验的人如何通过面试得到实践机会?
    Java学到什么程度可以面试工作?
    Java培训班学员如何找工作?如何过试用期?
    作为Java技术面试官,我如何深挖候选人的技能
    今年我拿到了期望中的收入,同时更希望能在睡后收入上有进一步的发展——2021年我的总结与思考
    程序员月薪一万到底难不难?
    自学java,如何快速地找到工作
    搞IT的应届生如何写好简历?
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12338015.html
Copyright © 2020-2023  润新知