详解Python中的数据精度问题

目录
  • 一、python运算时精度问题
    • 1.运行时精度问题
    • 2.解决方案:添加方法
  • 二、python四舍五入时精度问题
    • 1.使用round与浮点数格式化时候的精度问题
    • 2.解决方案,使用Decimal函数

一、python运算时精度问题

1.运行时精度问题

在Python中(其他语言中也存在这个问题,这是计算机采用二进制导致的),有时候由于二进制和十进制之间对应问题会导致数值的精度问题,比如无法用有限个二进制位完整地表示0.1,因为0.1转化为二进制之后位一个无限循环小数

print(1.1*2.2)

查看运行结果:

2.解决方案:添加方法

需要将整数部分与小数部分单独做处理可以解决

def multiple(m1, m2):
    r=''
    ## 若存在浮点型,则先转化为整数
    if type( m1 )==float or type( m2 )==float:
        print( "存在浮点数" )
        len_m1=len( str( m1 ).split( "." )[1] )
        len_m2=len( str( m2 ).split( "." )[1] )
        print( "m1的小数位:", len_m1 )
        print( "m2的小数位:", len_m2 )

        m1=int( 10**len_m1*m1 )
        m2=int( 10**len_m2*m2 )
        print( "m1化为整数:", m1 )
        print( "m2化为整数:", m2 )
        r=str( m1*m2 )
        print( "r:", r )

        l=len_m1+len_m2
        print( "l的总长度:", l )
        if l<len( r ):
            r_front=r[:-l]
            r_last=r[-l:]
            print( r_front, "-", r_last )
            r=r_front+"."+r_last
        else:
            r="0."+(l-len( r ))*"0"+r

    else:
        print( "不存在浮点数" )
        r=m1*m2
    return r

res = multiple(1.1,2.2)
print(res)

查看运行结果:

二、python四舍五入时精度问题

1.使用round与浮点数格式化时候的精度问题

归根结底是计算机存储浮点数的问题

a1 = 0.235
a2 = round(a1,2)
a3 = '%.2f' % a1
print(a2)
print(a3)

查看运行结果:

2.解决方案,使用Decimal函数

需要将float转换为Decimal,该类可以通过接受字符串(务必是字符串)形式的浮点数实现相对精确的小数计算(减缓了精度误差,但没有消灭)

from decimal import Decimal

a1 = 0.235
a2 = Decimal(str(a1)).quantize(Decimal("0.00"))
a3 = '{:.2f}'.format(Decimal(str(a1)))
print(a2)
print(a3)

查看运行结果:

到此这篇关于详解Python中的数据精度问题的文章就介绍到这了,更多相关Python数据精度问题内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python输出小数精度控制的方法

    目录 一.要求较小的精度 1.round()内置方法 2. 使用格式化 二.要求超过17位的精度分析 1. 使用格式化(不推荐) 2. 高精度使用decimal模块,配合getcontext 三.关于小数和取整 1. round() 2. math模块的ceil(x) 3. math模块的floor(x) 一.要求较小的精度 将精度高的浮点数转换成精度低的浮点数. 1.round()内置方法 round()不是简单的四舍五入的处理方式. >>> round(2.5) 2 >>

  • 如何基于Python代码实现高精度免费OCR工具

    近期Github开源了一款基于Python开发.名为Textshot的截图工具,刚开源不到半个月已经500+Star. 这两天抽空看了一下Textshot的源码,的确是一个值得介绍的项目. 相对于大多数OCR工具复杂工程.差强人意的效果,Textshot具有明显的优势, 项目简单 技术点丰富 项目简单 Textshot整个项目只有1个Python文件.139行代码,没有复杂的第三方库应用,也不涉及过多后端算法的调用. 技术点丰富 Textshot这个项目虽然只有短短的139行代码,但是,却涉及P

  • python读出当前时间精度到秒的代码

    导入time这个包就可以通过它获取是时间 # -*- coding: UTF-8 -*- import time print(time.time()) # 输出:1562304217.5744529 通过执行上面代码后我们发现我们得到的是一个时间戳,这个时间戳是根据1970年到现在的秒数据 但是很多人需求并不要一个时间戳,而是要所有人都看的懂的(年月日,时分秒) 所以我们需要将这个时间戳进行计算,一分钟是60秒,所以我们就要算分钟,这些是可以通过模运算来解决这个问题的.不过已经有人帮我们做了这个

  • python实现高精度求自然常数e过程详解

    目录 泰勒展开与e的求法 python和神奇的decimal 计算 比较 完整代码 泰勒展开与e的求法 大家伙儿知道计算机里的 e是怎么求出来的吗? 这还要从神奇的泰勒展开讲起…… 简单的说,就是 e,可以表示成: 很显然,当 n足够小的时候,精度已经很高了,后面的级数是收敛的,可以忽略不计.而这显然可以用计算机来计算. python和神奇的decimal 很多人习惯用python算高精度整数,因为python的整数是高精度的,但是浮点数却只有32位,这里python提供了一个神奇的库“deci

  • Python生成任意范围任意精度的随机数方法

    实例如下所示: # -*- coding: utf-8 -*- import numpy as np random = np.random.RandomState(0)#RandomState生成随机数种子 for i in range(200):#随机数个数 a = random.uniform(-0.1, 0.1)#随机数范围 print round(a, 2)#随机数精度要求 以上这篇Python生成任意范围任意精度的随机数方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大

  • 详解Python中的数据精度问题

    目录 一.python运算时精度问题 1.运行时精度问题 2.解决方案:添加方法 二.python四舍五入时精度问题 1.使用round与浮点数格式化时候的精度问题 2.解决方案,使用Decimal函数 一.python运算时精度问题 1.运行时精度问题 在Python中(其他语言中也存在这个问题,这是计算机采用二进制导致的),有时候由于二进制和十进制之间对应问题会导致数值的精度问题,比如无法用有限个二进制位完整地表示0.1,因为0.1转化为二进制之后位一个无限循环小数 print(1.1*2.

  • 详解python中executemany和序列的使用方法

    详解python中executemany和序列的使用方法 一 代码 import sqlite3 persons=[ ("Jim","Green"), ("Hu","jie") ] conn=sqlite3.connect(":memory:") conn.execute("CREATE TABLE person(firstname,lastname)") conn.executeman

  • 详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别

    详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别 os._exit() 和 sys.exit() os._exit() vs sys.exit() 概述 Python的程序有两中退出方式:os._exit(), sys.exit().本文介绍这两种方式的区别和选择. os._exit()会直接将python程序终止,之后的所有代码都不会继续执行. sys.exit()会引发一个异常:SystemExit,如果这个异常没有被捕获,那

  • 详解 Python中LEGB和闭包及装饰器

    详解 Python中LEGB和闭包及装饰器 LEGB L>E>G?B L:local函数内部作用域 E:enclosing函数内部与内嵌函数之间 G:global全局作用域 B:build-in内置作用域 python 闭包 1.Closure:内部函数中对enclosing作用域变量的引用 2.函数实质与属性 函数是一个对象 函数执行完成后内部变量回收 函数属性 函数返回值 passline = 60 def func(val): if val >= passline: print (

  • 详解python中的文件与目录操作

    详解python中的文件与目录操作 一 获得当前路径 1.代码1 >>>import os >>>print('Current directory is ',os.getcwd()) Current directory is D:\Python36 2.代码2 如果将上面的脚本写入到文件再运行 Current directory is E:\python\work 二 获得目录的内容 Python代码 >>> os.listdir (os.getcwd

  • 详解python中的 is 操作符

    大家可以与Java中的 == 操作符相互印证一下,加深一下对引用和对象的理解.原问题: Python为什么直接运行和在命令行运行同样语句但结果却不同,他们的缓存机制不同吗? 其实,高票答案已经说得很详细了.我只是再补充一点而已. is 操作符是Python语言的一个内建的操作符.它的作用在于比较两个变量是否指向了同一个对象. 与 == 的区别 class A(): def __init__(self, v): self.value = v def __eq__(self, t): return

  • 详解python中asyncio模块

    一直对asyncio这个库比较感兴趣,毕竟这是官网也非常推荐的一个实现高并发的一个模块,python也是在python 3.4中引入了协程的概念.也通过这次整理更加深刻理解这个模块的使用 asyncio 是干什么的? 异步网络操作并发协程 python3.0时代,标准库里的异步网络模块:select(非常底层) python3.0时代,第三方异步网络库:Tornado python3.4时代,asyncio:支持TCP,子进程 现在的asyncio,有了很多的模块已经在支持:aiohttp,ai

  • 详解python中的线程

    Python中创建线程有两种方式:函数或者用类来创建线程对象. 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程. 类:创建threading.Thread的子类来包装一个线程对象. 1.线程的创建 1.1 通过thread类直接创建 import threading import time def foo(n): time.sleep(n) print("foo func:",n) def bar(n): time.sleep(n) prin

  • 详解Python中pyautogui库的最全使用方法

    在使用Python做脚本的话,有两个库可以使用,一个为PyUserInput库,另一个为pyautogui库.就本人而言,我更喜欢使用pyautogui库,该库功能多,使用便利.下面给大家介绍一下pyautogui库的使用方法.在cmd命令框中输入pip3 install pyautogui即可安装该库! 常用操作 我们在pyautogui库中常常使用的方法,如下: import pyautogui pyautogui.PAUSE = 1 # 调用在执行动作后暂停的秒数,只能在执行一些pyaut

  • 详解Python中namedtuple的使用

    namedtuple是Python中存储数据类型,比较常见的数据类型还有有list和tuple数据类型.相比于list,tuple中的元素不可修改,在映射中可以当键使用. namedtuple: namedtuple类位于collections模块,有了namedtuple后通过属性访问数据能够让我们的代码更加的直观更好维护. namedtuple能够用来创建类似于元祖的数据类型,除了能够用索引来访问数据,能够迭代,还能够方便的通过属性名来访问数据. 接下来通过本文给大家分享python nam

随机推荐