在Python编程环境中,输入0.1+0.2,输出不是0.3,计算机返回的是0.30000000000000004这个神奇的数字,在不同语言中反复求证,几乎都会得到相同的答案。
IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number)),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。
IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。只有32位模式有强制要求,其他都是选择性的。大部分编程语言都有提供IEEE浮点数格式与算术,但有些将其列为非必需的。例如,IEEE 754问世之前就有的C语言,有包括IEEE算术,但不算作强制要求(C语言的float通常是指IEEE单精确度,而double是指双精确度)。
即IEEE-754定义了浮点数的格式、存储和运算,与现在的科学计数法如出一辙,例如光速299792458可以写作3.0*10^8,
三、问题原因十进制中小数的表示方法如下: 比如0.1就是1个
1
10
\frac{1}{10}
101
二进制中小数的表示方法如下: 比如0.5就是1个
1
2
\frac{1}{2}
21,但是二进制中没有
1
10
\frac{1}{10}
101。
实际上, 1 10 \frac{1}{10} 101在二进制中被写作0.000110011001100110011…,那么问题来了,计算机无法存储无限循环小数,float浮点数只有23个有效数字,因此23位之后的小数就被截断了,实际上计算机存储的浮点数与0.1十分相似,但并不完全相等,实际存储的是0.100000001490116119384765625,换句话说,计算机在表示0.1的时候就丢失了精度。
二进制中的这种现象在十进制中并不罕见。如十进制中的 1 3 \frac{1}{3} 31如果用小数表示,则为0.333333333,这时就丢失了精度,如果计算 1 3 + 1 3 + 1 3 \frac{1}{3}+\frac{1}{3}+\frac{1}{3} 31+31+31,求出的结果与1接近,但是并不等于1。
四、解决方案在现代编程语言中都会提供一种特殊的数据类型decimal(十进制定点数)专门用来表示任意精度的十进制数,用它进行运算不会产生任何精度的问题。
from decimal import Decimal
Decimal('0.1')+Decimal('0.2')
输出结果: 0.3
ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~