Python 为什么浮点数计算不准确

Python 为什么浮点数计算不准确

什么是浮点数

浮点数也被称为浮点数,它们表示实数,并且用小数点将整数和小数部分分开。浮点数也可以使用科学计数法表示,其中E或e表示10的幂(2.5e2 = 2.5 x 102 = 250)。

为什么浮点数计算不准确

浮点数计算不准确主要是因为有理数在基于2的有限表示中是近似的,并且一般来说,它们是不可在任何基中用有限位数表示的近似数。

示例

假设我们有一个分数 −

5/3

我们可以将上述内容以十进制表示为−

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个不同的值。 让我们来看一些转换及其结果。这将帮助我们更好地理解浮点数系统。

将浮点数转换为二进制(二进制数系统)

我们将看看如何将浮点数转换为二进制。二进制使用两个数字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

# Driver Code
n = input("Enter floating point value : \n")
p = int(input("Enter the number of decimal places of the result : \n"))
print(floatoctal_convert(n, places = p))

输出

Enter floating point value :2.34
Enter the number of decimal places of the result :3
10.256

将浮点数转换为八进制(基数为8的数制)

八进制数使用八个数字,0,1,2,3,4,5,6,7。也称为八进制数制。八进制数中的每个位置表示基数(8)的0次幂。八进制数中的最后一个位置表示基数(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("Enter the floating point value : \n")
p = int(input("Enter the number of decimal places of the result : \n"))
print(float_convert_octal(n, places = p))

输出

Enter the floating point value :
6.89
Enter the number of decimal places of the result :
12
6.707534121727

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程