首页
学习
活动
专区
圈层
工具
发布

浮点数精度不再是困扰:Python高手的精准编程秘籍!解决Python浮点数精度问题!

from decimal import Decimal, getcontext # 设置全局精度(可选) getcontext().prec = 7 # 设置全局精度为7位 #...Decimal,但可能会失去精度控制 上下文(Context) 上下文(context)是一个环境,它定义了算术运算的规则。...通过getcontext()可以获取当前的全局上下文,并对其进行设置。上下文的主要属性包括: prec:精度,即小数点后的位数。 rounding:舍入模式。 traps:是否抛出异常。...from decimal import Decimal, getcontext # 设置全局精度 getcontext().prec = 28 a = Decimal('0.1'...a = 0.1 + 0.2 print(f"{a:.2f}") # 输出 0.30,保留了两位小数 这种方法只是改变了输出的显示方式,并不改变a的实际值。 3.

1.5K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    python里的decimal类型转换

    'Decimal:', decimal.Decimal(t)           基于元组的表示创建时不太方便,不过它提供了一种可移植的方式,可以导出小数值而不会损失精度。...与 NaN 比较大小来确定排序顺序没有明确定义,这会导致一个错误。上下文         到目前为止,前面的例子使用的都是 decimal 模块的默认行为。...2. 精度         上下文的 prec 属性控制着作为算术运算结果所创建的新值的精度。字面量值会按这个属性保持精度。 ...Context 支持 with 使用的上下文管理器 API,所以这个设置只在块内应用。         ...线程         “全局”上下文实际上是线程本地上下文,所以完全可以使用不同的值分别配置各个线程。

    2.4K30

    小 bug 引发大灾难,0.1 + 0.2 的结果竟然是……

    具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数 部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。...所以当两个存在误差的数相加,其结果也必定会出现误差,这就解释了在计算机中为什么 0.1 + 0.2 不等于 0.3。...即两个数的差值足够小。 确保数组的索引都是整数。 按分(而不是元)计算金额。百分比放大100倍计算以避免出现小数。 Python3 使用除法 / 时需注意,它的结果总是小数,整除的符号是 //。...它具有以下特点: 提供十进制数据类型,并且存储为十进制数序列; 有界精度:用于存储数字的位数是固定的,可以通过 decimal.getcontext().prec=x来设定,不同的数字可以有不同的精度...可以通过整数、字符串或者元组构建 decimal.Decimal,对于浮点数需要先将其转换为字符串 >>>from decimal import * # 设置精度为 7 位 >>>getcontext(

    1.2K90

    为什么你需要少看中文技术博客以及如何在Python里面精确四舍五入

    网上有人说,因为在计算机里面,小数是不精确的,例如 1.115在计算机中实际上是 1.1149999999999999911182,所以当你对这个小数精确到小数点后两位的时候,实际上小数点后第三位是 4...但是如果我们在Python中把 0.125精确到小数点后两位,那么它的就会变成 0.12: >>> round(0.125, 2)0.12 为什么在这里 四舍了?...还有更奇怪的,另一个在计算机里面能够精确表示的小数 0.375,我们来看看精确到小数点后两位是多少: >>> round(0.375, 2)0.38 为什么这里又 五入了?...如果不能,那么它可能并没有达到四舍五入的标准,例如 1.115,它的小数点后第三位实际上是 4,当然会被舍去。...如果你的这个小数在计算机中能被精确表示,那么, round采用的进位机制是 奇进偶舍,所以这取决于你要保留的那一位,它是奇数还是偶数,以及它的下一位后面还有没有数据。

    92820

    如何在 Python 里面精确四舍五入?

    网上有人说,因为在计算机里面,小数是不精确的,例如 1.115在计算机中实际上是 1.1149999999999999911182,所以当你对这个小数精确到小数点后两位的时候,实际上小数点后第三位是 4...但是如果我们在Python中把 0.125精确到小数点后两位,那么它的就会变成 0.12: >>> round(0.125, 2)0.12 为什么在这里 四舍了?...还有更奇怪的,另一个在计算机里面能够精确表示的小数 0.375,我们来看看精确到小数点后两位是多少: >>> round(0.375, 2)0.38 为什么这里又 五入了?...如果不能,那么它可能并没有达到四舍五入的标准,例如 1.115,它的小数点后第三位实际上是 4,当然会被舍去。...如果你的这个小数在计算机中能被精确表示,那么, round采用的进位机制是 奇进偶舍,所以这取决于你要保留的那一位,它是奇数还是偶数,以及它的下一位后面还有没有数据。

    5.4K50

    Python里精确地四舍五入,以及你为什么需要少看垃圾博客

    网上有人说,因为在计算机里面,小数是不精确的,例如1.115在计算机中实际上是1.1149999999999999911182,所以当你对这个小数精确到小数点后两位的时候,实际上小数点后第三位是4,所以四舍五入...但是如果我们在Python中把0.125精确到小数点后两位,那么它的就会变成0.12: >>> round(0.125, 2) 0.12 为什么在这里四舍了?...还有更奇怪的,另一个在计算机里面能够精确表示的小数0.375,我们来看看精确到小数点后两位是多少: >>> round(0.375, 2) 0.38 为什么这里又五入了?...如果不能,那么它可能并没有达到四舍五入的标准,例如1.115,它的小数点后第三位实际上是4,当然会被舍去。...如果你的这个小数在计算机中能被精确表示,那么,round采用的进位机制是奇进偶舍,所以这取决于你要保留的那一位,它是奇数还是偶数,以及它的下一位后面还有没有数据。

    5.9K63

    Python 四舍五入

    舍入到指定的小数位数: 对于需要舍入的位数右侧的第一位数字(即“决定位”),如果它小于5,则舍去它和它右侧的所有数字。...如果“决定位”大于或等于5,则舍去它和它右侧的所有数字,并将“决定位”前一位数字加1。 例如: 3.141592653589 四舍五入到两位小数是 3.14。...向下舍入: 不论“决定位”是什么数字,总是将数值舍入到比它小的最接近的整数或小数位数。 例如: 2.9 向下舍入到整数是 2。...用法稍微复杂一点,但是靠谱的时候多一些: 1234567891011121314151617181920212223 import decimalfrom decimal import Decimaldecimal.getcontext...decimal.ROUND_HALF_EVEN:四舍五入,5向最近的偶数舍入。 但是我在一次实验中还是发现了不正确的四舍五入,暂时没有复现,使用的时候还是要多加小心。

    1.1K10

    入门篇:Python里的数

    整数 整数,令人惊叹于它的简单。两个整数相除,例如4/3,得到一个浮点数,并且(4/3)*3的结果也是浮点数4.0。即便你没有定义浮点数,在进行除法运算的时候,它会自动出现。...小数 小数在财务中用途最广,最无聊的是居然以法律的方式规定了小数的形式。然而,Python中所有的小数点运算,都有上下文精确度问题,对此,可以用专门的模块解决。...>>> getcontext().prec = 6 >>> Decimal(1) / Decimal(7) Decimal('0.142857') >>> getcontext().prec = 28...>>> Decimal(1) / Decimal(7) Decimal('0.1428571428571428571428571429') 在实际项目中,代码中设置精度的位置和进行计算的位置可能间隔几百行...最安全的方法是使用localcontext: >>> getcontext().prec = 6 >>> # 6853 lines elided ... with localcontext() as ctx

    89431

    【测试开发】python系列教程:decimal库

    它提供了一个完整的货币处理API,可以处理各种货币常见的业务,如货币兑换、汇率计算、支付处理等。...Decimal类型 print(Decimal.from_float(22.22)) #结果: 3、通过设定有效数字,限定结果样式 from decimal import * #表示设置小数只取6位小数位...getcontext().prec=6 print(Decimal(1)/Decimal(7)) #结果:0.142857 getcontext().prec=3 print(Decimal(55...)*1000) #结果:5.50E+4 【注】:当设置prec长度比数字的长度小的话,结果会有误 4、四舍五入,保留几位小数 print(Decimal('5.1251').quantize(Decimal...(x2.quantize(Decimal('1.0000'),ROUND_FLOOR)) #-3.1235,floor地板趋近于更小,所以始终进位了(因为是负数如果是正数就不会进位) print

    66610

    Python3 四舍五入问题详解

    本来一个简单的问题,为什么变得难以理解,难道是Python的round策略出了问题? 作为一个专业级语言平台,Python显然不会没有想到这样的问题。 其实,浮点数问题并非我们想象的那样简单。 二....进位近似值大于原值,截断近似值小于原值,所以对小数位较小的数值(如1.215被进位,1.275被截断),进位近似值会出现尾部的增加值(上面说的尾部乱码),截断近似值小于原值,会出现”999......# 使用字符串得到精确值 >>> getcontext().prec = 52 # 设置精度为52位(这里指十进制) >>> Decimal(‘1’) / Decimal(str(2**52))...) + Decimal('0.2') Decimal('0.3') # 精度范围内,准确运算 >>> getcontext().prec = 3 >>> getcontext().rounding...Context管理,设置取舍精度和策略 >>> tc = getcontext() # 获取运算环境 >>> tc.prec 28 # 缺省精度 >>> tc.rounding

    4K30

    Python入门系列第二章--第一节:变量、字符串与数字

    # 定义浮点型变量c = 2.01d = 3.1# 打印 c+d的结果将得出5.1099999999999print(c + d) 大家一定会疑问,2.01+3.1 应该是5.11吗,为什么控制台输出的是...5.109999999呢?...其实这是浮点数一个普遍的问题,浮点数并不能准确地表示十进制, from decimal import Decimal,getcontext z = Decimal(str(c))+Decimal(str...(d)) print(z) 在某些情况下需要精确到小数点后N位(精确度)则可以利用getcontext()设置精确度 getcontext().prec = 2z = Decimal(str(c)) /...所支持的类型 整型:没有大小限制 浮点型:由小数和整数已经小数点组成 复数:由实数部分和虚数部分构成 数据类型是不允许改变的,这就意味着如果改变数字数据类型 的值,将重新分配内存空间 3.创建三种类型的数字变量

    49540

    Python随记(2)数据类型(小数,分数) 分支循环

    >>(3,2,2.57) #四舍五入 math.sqrt(144) >>12.0 144 ** .5 >>>12.0 pow(155,5) 小数类型  精度固定的浮点数。...使用小数对象我们可以得到一个只保留两位小数为精度的浮点数。这对表达固定精度的特性(货币的累加)以及对精度是实现都是一个理想的工具。 ...,默认改变层最小的 设置全局小数精度:decimal模块中的其他一些工具可以用来设置所有小数数值精度,安排错误处理等。 ...>>>decimal getcontext().prec =4  # 设置精度 >>>decimal Decimal(1)/ decimal Decimal(7) Decimal(0.1429) 分数基础知识...  Fraction(分数)与小数一样,他是用来处理浮点数类型的数值不准确性。

    95920

    第二章--第一节:变量、字符串与数字

    5.11吗,为什么控制台输出的是5.109999999呢?...但是在某些环境中(比如财务统计),需要精确的浮点型,我们可使用python的decimal模块进行计算其中Decimal的参数必须是字符串,利用str函数将数字转换成字符串 from decimal import...Decimal,getcontext z = Decimal(str(c))+Decimal(str(d)) print(z) 在某些情况下需要精确到小数点后N位(精确度)则可以利用getcontext...()设置精确度 getcontext().prec = 2 z = Decimal(str(c)) / Decimal(str(d)) print(z) 3.变量赋值的特殊方法 在第2个小结我们所看到的都是...所支持的类型 整型:没有大小限制 浮点型:由小数和整数已经小数点组成 复数:由实数部分和虚数部分构成 数据类型是不允许改变的,这就意味着如果改变数字数据类型 的值,将重新分配内存空间 3.创建三种类型的数字变量

    48830

    Python数据类型之数字

    当我们创建第一个对象v1的时候会在内存中开辟一块空间作为存放v1对象的值,当我们创建第二个对象v2的时候也会在内存中开辟一块空间来作为v2对象的值,那如果这样说,那是不是说对象v1和v2的内存地址是两块呢...123 >>> id(v1), id(v2) (4549969744, 4549969744) 通过上面的结果我们可以看到var1和var2的内存地址是相同的,就代表他们的值是使用的同一块空间,所以当两个或者多个对象的值都是同一个的时候...为什么要叫做float浮点型: 浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如: 1.23 * 109和 12.3 * 108是相等的。...>>> from decimal import * >>> getcontext() Context(prec=50, rounding=ROUND_HALF_EVEN, Emin=-999999,...().prec = 50 >>> a = Decimal(1)/Decimal(3)#注,在分数计算中结果正确,如果直接定义超长精度小数会不准确 >>> a Decimal('0.33333333333333333333333333333333333333333333333333

    1.7K20

    Python数值类型

    真除法、Floor除法和小数位截断 /:实现的是真除法。在python中,它总是返回浮点数值。 //:实现的是floor地板除法,它会去掉除法运算后的小数位,以便得到小于运算结果的最大整数。...小数类型(Decimal) 小数模块decimal,它有一个函数Decimal(),它是精确的,是可以指定小数位数的。 如果没有python基础,这里能看懂多少算多少,反正小数用的也不多。...有两种范围的精度:全局范围、局部范围。 例如,没有设置精度时,会保留很多位数的小数。...') 设置全局范围的精度为4,即保留4位小数: >>> import decimal >>> decimal.getcontext().prec = 4 >>> decimal.Decimal(1) /...还可以设置局部范围的精度,局部表示退出了这个范围就失效了。使用with/as语句可以设置局部精度,所以退出with/as语句块精度的设置就失效了。

    2.8K30
    领券