python float精度处理

简介: python float精度处理

一个简单的面试题:

>>>0.1+0.1+0.1
0.2
>>>0.1+0.1+0.1
0.30000000000000004
>>>0.1+0.1+0.1-0.3
5.551115123125783e-17


下面一个简单的例子:


a = 0.0
for i in range(10):
  print(a)
a+=0.1

结果: 打印0.1 连续相加10次,会显示不同的值,既是精度损失造成的.

另外一个问题:(精度控制)

关于小数和取整->高精度---低精度 round()

1. 不指定小数点位数, 即取整数, 四舍五入: (取到哪一位的后面一位, 若遇到.5 奇进偶不进)

round(2.3)   -2.0
round(2.6)   -3.0
round(2.5)   -3.0
round(1.5)   -2.0

2. 指定小数点位数, 即有小数位, 四舍五入: (取到哪一位的后面一位, 若遇到.5 偶进奇不进)

round(2.635,2)  -2.63
round(2.645,2)  -2.65
round(2.655,2)  -2.65
round(2.665,2)  -2.67
round(2.675,2)  -2.67

3. math模块的ceil(x)


取大于或者等于x的最小整数.

4. math模块的floor(x)

取小于或者等于x的最大整数.

f = 11.2
math.floor(f)   向下取整   #11.0
math.ceil(f)     向上取整  #12.0
>>> x = 0.0
>>> for i in range(10):
  x += 0.1
  print(x)
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999

即:为什么有几行的输出看起来不对?


因为 Python 中使用双精度浮点数来存储小数。在 Python 使用的 IEEE 754 标准(52M/11E/1S)中,8字节64位存储空间分配了52位来存储浮点数的有效数字,11位存储指数,1位存储正负号,即这是一种二进制版的科学计数法格式。虽然52位有效数字看起来很多,但麻烦之处在于,二进制小数在表示有理数时极易遇到无限循环的问题。其中很多在十进制小数中是有限的,比如十进制的 1/10,在十进制中可以简单写为 0.1 ,但在二进制中,他得写成:


0.0001100110011001100110011001100110011001100110011001…..(后面全是 1001 循环)。因为浮点数只有52位有效数字,从第53位开始,就舍入了。这样就造成了标题里提到的”浮点数精度损失“问题。 舍入(round)的规则为“0 舍 1 入”,所以有时候会稍大一点有时候会稍小一点。


Python 的浮点数类型有一个 .hex()方法,调用能够返回该浮点数的二进制浮点数格式的十六进制版本。这话听着有点绕,其实是这样的:本来浮点数应该有一个 .bin() 方法,用来返回其二进制浮点数格式。如果该方法存在的话,它看起来就像这样(p-4表示×2-4,或者可以简单理解为小数点 左移 4 位):


目录
相关文章
|
3月前
|
Python
Python中的float语句
Python中的float语句
|
3月前
|
JSON 数据格式 Python
【python】解决json.dump(字典)时报错Object of type ‘float32‘ is not JSON serializable
在使用json.dump时遇到的“Object of type ‘float32’ is not JSON serializable”错误的方法,通过自定义一个JSON编码器类来处理NumPy类型的数据。
121 1
|
4月前
|
存储 Python
语音输入,python数据类型,type()用来查看数据类型,数据类型转换,int(x)转整数,float(x)转换为浮点数,str(x),将对象转为字符串,标识符,标识符不允许使用关键字,关键字参考
语音输入,python数据类型,type()用来查看数据类型,数据类型转换,int(x)转整数,float(x)转换为浮点数,str(x),将对象转为字符串,标识符,标识符不允许使用关键字,关键字参考
|
6月前
|
存储 Python
Python浮点型(float)
【4月更文挑战第9天】Python中的浮点型(float)表示实数,基于IEEE 754双精度标准,约有15-17位十进制精度。创建浮点型变量可通过直接赋值,如`x = 3.14`。支持加减乘除等运算,但运算可能因精度问题产生不精确结果,如`0.1 + 0.2 != 0.3`。可使用`round()`函数四舍五入,或通过`is_close()`函数比较浮点数是否接近。在需要高精度计算时,建议使用`decimal`模块。
88 2
|
6月前
|
Python
Python的整型在计算中的精度可以通过使用二进制或十进制表示来体现
【5月更文挑战第6天】Python整型支持十、二、八、十六进制表示,其中十进制默认,二进制(0b前缀)、八进制(0o前缀)、十六进制(0x前缀)。计算时以二进制精度处理,确保结果准确。例如:123的二进制是0b1111011,八进制是0o173,十六进制是0x7b。
36 0
|
6月前
|
安全 Python
Python系列(16)—— string类型转float类型
Python系列(16)—— string类型转float类型
|
6月前
|
前端开发 Python
Python float(input())的用法,web中的应用
要理解Python中的float(input()),可以分两部分。第一,input()用于获取键盘上的输入,该函数的返回值是一个Python字符串str类型的数据——不过输入的是什么;第二,float()函数用于将传递的参数——这里就是input()的返回值,一个字符串——转换为float浮点数的类型。float()函数转换input()的返回值相对于使用int()可以保留相应的精度。
158 1
|
11月前
|
Python
Python的整型在计算中的精度是如何表示的?
Python的整型在计算中的精度是如何表示的?
72 2
float与double精度丢失问题
float与double精度丢失问题
112 0
|
Python
【Python入门篇】——Python基础语法(字符串扩展和格式化的精度控制)
【Python入门篇】——Python基础语法(字符串扩展和格式化的精度控制)
150 0