Python 的浮点数损失精度问题（为什么说双精度浮点数有15位十进制精度） 原

lionets

``````

>>>

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 的浮点数类型有一个 .hex()方法，调用能够返回该浮点数的二进制浮点数格式的十六进制版本。这话听着有点绕，其实是这样的：本来浮点数应该有一个 .bin() 方法，用来返回其二进制浮点数格式。如果该方法存在的话，它看起来就像这样（p-4表示乘以 ２-4，或者可以简单理解为小数点 左移 4 位）：

``````

>>>

(

0.1

).bin()

#

本方法其实并不存在

'

1.1001100110011001100110011001100110011001100110011010p-4

'

``````

``````

>>>

(

0.1

).hex()

'

0x1.999999999999ap-4

'

``````

``````

>>>

float.fromhex(

'

0x1.8p+1

'

)

==

float.fromhex(

'

0x3.0p+0

'

)
True

``````

``````

>>>

Decimal(

0.1

)

==

Decimal(

'

0.1

'

)
False

``````

``````

>>>

(

0.5

).as_integer_ratio()
(

1

,

2

)

``````

``````

>>>

print

(Decimal(

0.1

))

0.1000000000000000055511151231257827021181583404541015625

``````

``````

a

=

0.1

for

i

in

range(

10

):

print

(round(a,

15

))
a

+=

0.1

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1.0

``````

``````

>>>

a

=

0.0

>>>

for

i

in

range(

10

):
a

+=

0.1

print

(a)

print

(

'

%.17f

'

%

a)

print

(

'

-

'

*

19

)

0.1

0.10000000000000001

-------------------

0.2

0.20000000000000001

-------------------

0.30000000000000004

0.30000000000000004

-------------------

0.4

0.40000000000000002

-------------------

0.5

0.50000000000000000

-------------------

0.6

0.59999999999999998

-------------------

0.7

0.69999999999999996

-------------------

0.7999999999999999

0.79999999999999993

-------------------

0.8999999999999999

0.89999999999999991

-------------------

0.9999999999999999

0.99999999999999989

-------------------

``````

``````

>>>

'

%.60f

'

%

(

0.1

+

0.1

+

0.1

+

0.1

+

0.1

)

'

0.500000000000000000000000000000000000000000000000000000000000

'

>>>

print

(Decimal(

0.1

+

0.1

+

0.1

+

0.1

+

0.1

))

0.5

``````

lionets

1、问题： 之前有同学问过这样一个问题： echo|awk '{print 3.99 -1.19 -2.80}'4.44089e-16 类似的问题还有在 java 或者 javascript 中： 23.53 + 5.88 + 17.64 = 47.05 23.53 + 17.64 + 5.8...

2013/08/26
0
0
0.1+0.2 !== 0.3？

ShuaiKangZhang
10/26
0
0

10/03
0
0
Python 浮点数运算

rainyear
2016/05/12
84
0
python3测试工具开发快速入门教程9重要的标准库-高级篇

python人工智能测试开发
09/04
0
0

Pure-ftpd搭建FTP

12月11日任务 15.4 xshell使用xftp传输文件 15.5 使用pure-ftpd搭建ftp服务 使用pure-ftpd搭建FTP服务 轻量的ftp软件 安装pure-ftpd并修改配置文件 # pure-ftpd为epel扩展库里的软件[root...

robertt15
11分钟前
2
0

17分钟前
1
0
Android面试整理(附答案)

22分钟前
3
0
Vue 改变数组触发视图更新

Vue 改变数组触发视图更新 以下方法调用会改变原始数组 push(), pop(), shift(), unshift(), splice(), sort(), reverse()push()push() 方法可向数组的末尾添加一个或多个元素，并返回新的...

27分钟前
2
0

lionets
44分钟前
3
0