Python实现保留三位有效数字

2023-10-27

  网上查找了较多的四舍五入的方法,发现不是自己想要的,于是自己按数目级别写了一段,后面又做了更改,做了简单的整合。

  整体思路就是取第三位数作判断,如果是第三位是5,再判断第四位的奇偶性 ,作为小白,代码整体逻辑比较呆板,希望有大神做下修改。

# 定义保留三位有效数字
# 默认数值均大于1,小于100000
def restain3(a):
    if a<10: 
        if int(str(float(a))[4]) != 5:
            a = round(a,2) 
        elif int(str(float(a))[5])%2 != 0:
            a = round(a,2)
        else:
            a = int(a*100)/100
    elif a<100:
        if int(str(float(a))[4]) != 5:
            a = round(a,1) 
        elif int(str(float(a))[5])%2 != 0: 
            a = round(a,1)
        else:
            a = int(a*10)/10
    elif a<1000:
        if int(str(float(a))[4]) != 5:
            a = int(round(a,0)) 
        elif int(str(float(a))[5])%2 != 0: 
            a = int(round(a,0))
        else:
            a = int(a)
    elif a<10000:
        if int(str(int(a))[3]) != 5:
            a = round(a,-1) 
        elif int(str(float(a))[5])%2 != 0:
            a = round(a,-1)
        else:
            a = int(a/10)*10
    elif a<100000:
        if int(str(int(a))[3]) != 5:
            a = round(a,-2) 
        elif int(str(int(a))[4])%2 != 0: 
            a = round(a,-2)
        else:
            a = int(a/100)*100
    return a

总结了下整体的数字规律,做了更改,用到了math模块,因为字符串中小数点也可以使用切片查找,大体分为了三部分,小于1000,小于10000,大于1000。

import math
# 定义保留三位有效数字
# 默认数值均大于1
def restain3(a):
    if a<1000:
        if int(str('%.5f'%float(a))[4]) != 5:
            b = int(3-math.log10(pow(10,math.ceil(math.log10(a)))))
            a = round(a,b)
            if "." in str(a) and len(str(a)) <4:
                a = str(a)+str(0)
            elif len(str(a)) ==1:
                a = str(a)+str(".")+str(0)+str(0)
            elif "." not in str(a) and len(str(a)) ==2:
                a = str(a)+str(".")+str(0)+str(0)                
        elif int(str('%.5f'%float(a))[5])%2 != 0: 
            b = int(3-math.log10(pow(10,math.ceil(math.log10(a)))))
            a = round(a,b)
        else:
            b = int(3-math.log10(pow(10,math.ceil(math.log10(a)))))
            a = int(a*pow(10,b))*pow(10,-b)        
    elif a<10000:
        if int(str(int(a))[3]) != 5:
            a = round(a,-1) 
        elif int(str(float(a))[5])%2 != 0: 
            a = round(a,-1)
        else:
            a = int(a/10)*10
    else:
        if int(str(int(a))[3]) != 5:
            b = int(3-math.log10(pow(10,math.ceil(math.log10(a)))))
            a = round(a,b) 
        elif int(str(int(a))[4])%2 != 0: 
            b = int(3-math.log10(pow(10,math.ceil(math.log10(a)))))
            a = round(a,b)
        else:
            b = int(3-math.log10(pow(10,math.ceil(math.log10(a)))))
            a = int(a*pow(10,b))*pow(10,-b)
    return a

整体实现效果如下:

print(restain3(1),
      restain3(1.2),
      restain3(3.785974),
      restain3(7.895823),
      restain3(120.5597),
      restain3(1795.8989),
      restain3(12345.248),
      restain3(192857634684),sep='\n')
1.00
1.20
3.79
7.89
121.0
1790
12300.0
193000000000

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python实现保留三位有效数字 的相关文章

随机推荐

  • [黑科技] WPS通过VB宏函数实现自编号功能

    这篇文章主要是作为李老师 算法设计与分析 助教课程中 与她交流 学到的一些基础知识 它主要是讲述Word通过宏函数设置一些操作 比如在Word全文中替换一些符号 再如对Word上角表进行编号 如果删除中间某个值 运行宏函数自动编号 对Wor
  • 小程序-页面生成为图片,点击保存和分享

    前言 在实际项目中 我们可能会遇到类似的场景 点击后生成一张banner 该banner是图片类型 格式不限 用户在该页面单击之后会生成一个有遮罩的预览 长按之后有保存和分享等操作 一 海报制作 这里我们需要使用canvas来制作banne
  • 已经有int了,为什么要用integer?

    int是JAVA八大基本数据类型 byte shor int long char boolean float double 之一 JAVA语言为八大基本数据提供了包装类 Integer对应是int类型的包装类 就是把int类型包装成Obje
  • ffmpeg基础四:RTP协议

    参考 零声学院 协议学习方法 1 协议是什么 双方约定好如何传输消息 比如视频传输协议 要告诉你这个包是h264包 还是aac音频包 这个信息一般放在协议头 对方收到网络包 可以直接在协议头部获取出这些信息 所以协议的组成一般都是 协议头
  • [Python] 过程型程序设计进阶(三):Python函数装饰器

    概念 修饰器也是一个函数 接受一个函数或方法作为其唯一的参数 并返回一个修饰后的函数或方法 作用 对函数或方法进行一次修饰和包裹 之前学习过 property修饰器 接下来学习如何自定义一个修饰器 自定义函数修饰器 自定义一个装饰器 一般是
  • Jmeter集合点技术(同步定时器)

    一 集合点简介 我们怎么实现真正的并发 并发 指的是系统中正在操作业务的用户 在Jmeter中 成为线程数 Jmeter中的各线程 用户 在进行业务操作中的顺序存储存在一定的随机性 集合点的目的 让各个线程 用户 步调一致 对系统进行加压
  • MySQL8.0连接问题总结

    MySQL8 0连接问题总结 1 驱动包版本 2 驱动类 3 连接属性 1 驱动包版本 对于8 0版本的MySQL数据库 驱动包版本也要跟上 一般使用mysql connector java 8 0 11 否则会报如下错误 Caused b
  • vue代码片段

    Place your snippets for vue here Each snippet is defined under a snippet name and has a prefix body and description The
  • new Object() 和Object.create(null)

    new Object 和Object create null const obj1 a 10 b 20 const obj2 a 10 b 20 obj1 obj2 gt gt gt false 引用类型 因为内存地址不同 const ob
  • Spring之ApplicationContext快速入门

    目录 一 概述 二 代码演示 三 BeanFactory与ApplicationContext的关系 四 BeanFactory的继承体系 五 ApplicationContext的继承体系 一 概述 ApplicationContext称
  • mfc 程序闪退_VC6 在Window10 上操作打开文件时闪退或直接退出的解决方法

    1 下载FileTool exe 并解压 2 打开VC6 0 点击File Open Workspace 选择刚解压出来的FileTool dsw 并确定 3 点击Bulid Build FileTool dll 生成FileTool dl
  • 编程求1平方+2平方+...+n平方

    题目描述 编程求1平方 2平方 n平方 输入 输入一行 只有一个整数n 1 lt n lt 200 输出 输出只有一行 这意味着末尾有一个回车符号 包括1个整数 样例 输入 5 输出 55 提示 循环语句 include
  • 浅谈Visitor访问者模式

    一 前言 什么叫访问 如果大家学过数据结构 对于这点就很清晰了 遍历就是访问的一般形式 单独读取一个元素进行相应的处理也叫作访问 读取到想要查看的内容 对其进行处理就叫作访问 那么我们平常是怎么访问的呢 基本上就是直接拿着需要访问的地址来读
  • [USACO Open08]农场周围的道路

    题目描述 约翰的 N 1 N 10 9 只奶牛要出发去探索牧场四周的土地 她们将沿着一条路走 一直走到三岔路口 可以认为所有的路口都是这样的 这时候 这一群奶牛可能会分成两群 分别沿着接下来的两条路继续走 如果她们再次走到三岔路口 那么仍有
  • linux ./ 执行run文件,如何在Ubuntu中执行.bin和.run文件

    在解释如何在Ubuntu上执行 bin和 run文件之前 让我们首先定义这些文件扩展名到底是什么 Bin档 Ubuntu中的Binary或BIN文件指的是安装软件包 其中大多数是self extracting可执行文件 用于在系统上安装软件
  • BF算法 KMP算法

    BF算法 又叫朴素算法 时间复杂度为O mn 相比KMP算法比较简单 举个例子 对于给定的主字符串 ababbcabcdabcde 和子串 abcd 我们用i和j来分别遍历两个字符串 比较两个i j 对应字符串位置的元素是否相等 如果相等则
  • 应用软件的层次划分

    谈到应用程序的层次 我们平时所说的层次有两种 逻辑的层次 layer 和部署的层次 tier 这两种层次划分的目的是不同的 因此划分方式也有一些差异 能够为应用程序带来的好处也是不同的 逻辑层次逻辑层次 layer 划分的最重要的目的在于调
  • JavaScript设计模式(五)——发布订阅模式、桥接模式、组合模式

    个人简介 个人主页 前端杂货铺 学习方向 主攻前端方向 正逐渐往全干发展 个人状态 研发工程师 现效力于中国工业软件事业 人生格言 积跬步至千里 积小流成江海 推荐学习 前端面试宝典 Vue2 Vue3 Vue2 3项目实战 Node js
  • java父类_java 子类与父类

    子类是由继承得到的类 被继承的类就是父类 子类与父类是 is a 关系 一 子类与父类 1 子类 1 子类定义 class 子类名 extends 父类名 2 子类继承性 子类继承了父类的所有属性和除了构造方法的其余方法 子类与父类在同个包
  • Python实现保留三位有效数字

    网上查找了较多的四舍五入的方法 发现不是自己想要的 于是自己按数目级别写了一段 后面又做了更改 做了简单的整合 整体思路就是取第三位数作判断 如果是第三位是5 再判断第四位的奇偶性 作为小白 代码整体逻辑比较呆板 希望有大神做下修改 定义保