我的循环将 运行 变成负数,即使我是一个 if 语句告诉不要

my loop will run into negative numbers even when I am an if statement telling not to

这是一个简单的程序,我输入的是 $ 的零钱,我必须 return 硬币的总数。我的程序 运行 正确,直到它归结为数便士。有人能看到,为什么它会给出负输出,即使我用 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)

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

>>> 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)))

就个人而言,我不知道您的代码在做什么。这是一个使用除法和 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)