为什么Python中的浮点数计算不精确?
阅读更多:Python 教程
什么是浮点数?
浮点数也称为浮点数,它们表示实数,并用小数点分隔整数和小数部分。浮点数也可以采用科学计数法表示,其中E或e表示10的幂次方(2.5e2=2.5 x 102=250)。
为什么浮点数计算不准确?
浮点数计算不准确,主要是因为有理数在二进制中无法以有限的形式表示,并且一般说来,近似数不可能以任何进位制的有限位数来表示。
实例
假设我们有一个分数−
5/3
我们可以将以上分数转换成10进制
1.666...
1.666
1.667
如上所示,我们将两个表示1.666和1.667联系起来并称两者与分数5/3相等,即使第一个表示1.666…实际上在数学上等于分数。
第二个和第三个表示1.666和1.667的误差为0.001,这比9.2和9.1999999999999993之间的误差更为严重。第二个表示甚至没有正确地四舍五入!
我们对0.666作为数字2/3的表示没有问题,因此我们对9.2的近似表示也不应该有问题。
注意 − 有无限多个实数和无限多个有理数。浮点表示是有限的,因此不可避免地有很多数字是无法表示的。精确地说,64位只允许你区分出18,446,744,073,709,551,616个不同的值。
让我们看一些转换及其结果。这将有助于我们更好地理解浮点数系统。
将浮点数转换为二进制(2进制数系统)
我们将学习如何将浮点数值转换为二进制数字。二进制使用两个数字0和1。也称为2进制数系统。二进制数中的每个位置表示基数(2)的0次幂。二进制数中的最后一个位置代表基数(2)的x次幂。
首先,我们从浮点数值中获取整数部分并将其转换为二进制,然后取小数部分并将其转换为二进制形式,最后将两者组合即可−
实例
def floatoctal_convert(my_number, places = 3):
my_whole, my_dec = str(my_number).split(".")
my_whole = int(my_whole)
my_dec = int (my_dec)
res = bin(my_whole).lstrip("0b") + "."
for x in range(places):
my_whole, my_dec = str((my_decimal_converter(my_dec)) * 8).split(".")
my_dec = int(my_dec)
res += my_whole
return res
def my_decimal_converter(num):
while num > 1:
num /= 10
return num
# 驱动器代码
n = input("输入浮点数值:\n")
p = int(input("输入结果小数位数:\n"))
print(floatoctal_convert(n, places = p))
输出
输入浮点数值:2.34
输入结果小数位数:3
10.256
将浮点数转换为八进制(基数为 8 的数字系统)
八进制数字使用八个数字 0、1、2、3、4、5、6、7。也称为基数 8 的数字系统。八进制数字中的每个位置表示基数(8)的零次幂。八进制数字中的最后一个位置表示基数(8)的 x 次幂。
十进制数字系统的基数为 10,它使用从 0 到 9 的 10 个数字。在十进制数字系统中,小数点左侧的连续位置表示单位、十位、百位、千位等。
示例
给定一个浮点十进制值并输入小数位数,我们的任务是将其转换为八进制表达形式。
def float_convert_octal(my_number, places = 3):
my_whole, my_dec = str(my_number).split(".")
my_whole = int(my_whole)
my_dec = int (my_dec)
res = oct(my_whole).lstrip("0o") + "."
for x in range(places):
my_whole, my_dec = str((decimal_converter(my_dec)) * 8).split(".")
my_dec = int(my_dec)
res += my_whole
return res
def decimal_converter(num):
while num > 1:
num /= 10
return num
n = input("输入浮点数值:\n")
p = int(input("输入结果的小数位数:\n"))
print(float_convert_octal(n, places = p))
输出
输入浮点数值:
6.89
输入结果的小数位数:
12
6.707534121727
极客教程