【问题标题】:Occurrences of floating point errors and how to prevent them浮点错误的发生以及如何防止它们
【发布时间】:2018-06-29 09:44:12
【问题描述】:

我有这个程序可以计算用户输入的所有值的总数:

result = 0
for i in range(3):
    n = float(input("Enter a value: "))
    result = result + n
print(result)

如果我输入值 1.2、1.3、1.3,输出将是正确的并打印出 3.8 的结果。但是,当我输入三个相同的浮点值时,似乎会出现浮点错误。例如,1.2、1.2、1.2 将打印出 3.5999999999999996。

为什么会出现这种情况?有没有办法可以防止它?

【问题讨论】:

  • 基本上,如果您需要精确算术,请不要使用floats。相反,请使用 decimal 模块之类的东西。
  • @PatrickHaugh:decimal 也不准确。大多数情况下,它只是小数,所以它的不精确性更符合人类的直觉。 (它还提供可配置的精度和许多其他高级选项,但它们都不能解决舍入问题。)
  • 术语浮点错误通常表示除以零或反余弦值太大等异常。您所描述的不是那种错误,而是由于误解浮点数而产生的意外结果。根本问题是0.1 不能准确地用floatdouble 表示,就像1/3 不能用十进制表示法准确地表示一样。

标签: python


【解决方案1】:

它不起作用,因为float 做了更多的十进制数字,有关更多信息,请查看:link,因此您应该执行以下操作:

result = 0
for i in range(3):
    n = float(input("Enter a value: "))
    result = result + n
print('{0:.1f}'.format(result))

输出:

Enter a value: 1.2
Enter a value: 1.2
Enter a value: 1.2
3.6

或者:

result = 0
for i in range(3):
    n = float(input("Enter a value: "))
    result = result + n
print('%.1f'%result)

输出:

Enter a value: 1.1
Enter a value: 1.1
Enter a value: 1.1
3.3

decimal模块:

试试这个:

from decimal import Decimal
result = 0
for i in range(3):
    n = Decimal(input("Enter a value: "))
    result = result + n
print(result)

输出:

Enter a value: 2.1
Enter a value: 2.1
Enter a value: 2.1
6.3

【讨论】:

    【解决方案2】:

    发生这种情况是因为浮点数没有精确的表示,有关更多信息,请查看this

    如果精度对您很重要,您可以使用 python decimal

    【讨论】:

      猜你喜欢
      • 2010-09-06
      • 2018-01-17
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 2012-02-17
      • 1970-01-01
      • 2013-07-28
      相关资源
      最近更新 更多