【问题标题】:my loop will run into negative numbers even when I am an if statement telling not to即使我是一个 if 语句告诉不要,我的循环也会遇到负数
【发布时间】:2021-04-20 02:30:53
【问题描述】:

这是一个简单的程序,我在其中得到了作为欠款的输入,我必须返回硬币的总数。我的程序运行正常,直到归结为数便士。有人可以看到,为什么它会给出负输出,即使我用 if 语句告诉程序在它达到 0 后不要运行。

import sys
import cs50


val = cs50.get_float(("Change owed: "))

count = 0
newVal = val

while newVal > .25:
        newVal = round(newVal - 0.25, 2)
        print(newVal)
        count +=1
        if newVal == 0.25:
          newVal = round(newVal - 0.25, 2)
          print(newVal)
          count +=1
        elif newVal < 0.25:
          newVal = round(newVal - 0.10, 2)
          print(newVal)
          count +=1
          if newVal < 0.10:
            newVal = round(newVal - 0.05, 2)
            print(newVal)
            count +=1
            if newVal < 0.05:
              newVal = round(newVal - 0.01, 2)
              print(newVal)
              count +=1
              if newVal < 0:
                break
              
              
print(count)

【问题讨论】:

  • 也许 "

标签: python if-statement while-loop cs50


【解决方案1】:

就个人而言,我不知道您的代码在做什么。这是一个使用除法和 mod 的版本。它更简单。

import sys
import cs50


val = cs50.get_float(("Change owed: "))

count = 0
newVal = int(val * 100)

if newVal >= 25:
    count += int(newVal / 25)
    newVal = newVal % 25

if newVal >= 10:
    count += int(newVal / 10)
    newVal = newVal % 10

if newVal >= 5:
    count += int(newVal / 5)
    newVal = newVal % 5

if newVal >= 1:
    count += int(newVal / 1)

print(count)

【讨论】:

    【解决方案2】:

    您遇到的问题是它是一个浮点错误。即

    >>> 0.03 - 0.01
    0.019999999999999997
    

    如果您将给定值乘以 100 可能会更好,因此您将处理整数值而不是小数。

    换个说法:

    您可能应该除法而不是循环和减法,即

    coin_types = (25, 10, 5, 1)
    
    def solution(value: int):
        coins = 0
    
        for coin in coin_types:
            coins += value // coin
            value = value % coin
    
            if value == 0:
                return coins
    
    val = cs50.get_float(("Change owed: "))
    print(solution(int(val*100)))
    

    【讨论】:

    • 试着给它一些数字,比如 .66 和 .64 等等。没用。
    • 那么你正在查看一个浮点错误。
    • 你能解释一下吗?我只是说测试你自己的程序。在发布之前。
    • 浮点错误是由于十进制值(浮点数)在内存中的存储方式引起的。这是一个众所周知且记录在案的错误,我建议您在线查看。有例子here
    • 抱歉。可以编辑您的问题以显示示例输出的样子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2013-02-11
    相关资源
    最近更新 更多