【问题标题】:How do I fix a Floating Point Calculation issue?如何解决浮点计算问题?
【发布时间】:2021-09-06 09:01:04
【问题描述】:

所以,上周,我收到了一些关于 Python 3 的工作,其中一个问题如下:“编写 (a) 输入年份的程序。你的程序应该输出它是闰年还是不是。要确定它是否是闰年,请测试它是否能被 4 整除。"

这是我目前得到的:

yearStr = input("Please input a year: ")
year = float(yearStr)

calculation = year / 4

print(calculation)

if calculation == .0:
    print("This is a leap year.")
else:
    print("This is not a leap year.")

当我运行程序时,IF 语句没有按预期工作。你能帮帮我吗?

【问题讨论】:

  • 二进制表示的浮点数存在很多问题。您可以使用// 将数字四舍五入到整数。
  • 在需要测试闰年时,为什么您曾经将年份转换为浮点数?使用 int()。此外,您还需要模运算符来检查某些东西是否无余数 - 不是正常的除法。这是功课的味道。 year/4 将永远为 0 的唯一方法是如果 year 以 0 开头
  • @PatrickArtner:嗯,这个问题除了是家庭作业。没有错。这是一个有效的问题,而不是一个懒惰的家庭作业转储。

标签: python if-statement math floating-point integer


【解决方案1】:

您正在将计算与 0 进行比较,仅当年份为 0 时才为真。您可以检查整数值是否等于数字本身。

calculation = year / 4

print(calculation)

if int(calculation) == calculation:
    print("This is a leap year.")
else:
    print("This is not a leap year.")

不过,这不是解决这个问题的好方法,还有一个余数运算 - %。例如5 % 2 = 1。你可以这样使用它:

yearStr = input("Please input a year: ")
year = float(yearStr)

print(calculation)

if calculation % 4 == 0:
    print("This is a leap year.")
else:
    print("This is not a leap year.")

【讨论】:

    【解决方案2】:

    如果数能被整除,除法不会产生零,所以这种方法不能工作。

    相反,使用modulo (%) operator 获得除法的余数:

    year = int(yearStr)
    calculation = year % 4
    if calculation == 0: # leap year
        ...
    

    请注意,严格来说,闰年的确定比仅仅被 4 整除要复杂一些。但它会持续 79 年。

    【讨论】:

      【解决方案3】:

      您的问题是代码的性能。要检查年份是否为闰,您必须设置不同的条件。您现在可以使用此代码:

      year = int(input("Please input a year: "))
      
      if ((year%400 == 0) or ((year%4 == 0) and (year%100 != 0))):
          print("This is a leap year.")
      else:
          print("This is not a leap year.")
      

      【讨论】: