Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中int(x)的奇怪行为_Python_Floating Point_Int - Fatal编程技术网

python中int(x)的奇怪行为

python中int(x)的奇怪行为,python,floating-point,int,Python,Floating Point,Int,运行此程序时 cost = 12 money = 12.51 change = money - cost dollars = int(change) change -= dollars quarters = int(change / 0.25) change -= quarters * 0.25 dimes = int(change / 0.1) change -= dimes * 0.1 nickels = int(change / 0.05) change -= nickels *

运行此程序时

cost = 12
money = 12.51
change = money - cost

dollars = int(change)
change -= dollars

quarters = int(change / 0.25)
change -= quarters * 0.25

dimes = int(change / 0.1)
change -= dimes * 0.1

nickels = int(change / 0.05)
change -= nickels * 0.05

pennies = int(change / 0.01)

print("""Your change is:
    %i dollars
    %i quarters
    %i dimes
    %i nickels
    %i pennies
""" % (dollars, quarters, dimes, nickels, pennies))
输出是

Your change is:
    0 dollars
    2 quarters
    0 dimes
    0 nickels
    0 pennies
为什么便士是0?我试着分别打印硬币,同样的事情也发生了。我也知道
change/0.01
等于
1.0
。出于某种原因,
int(1.0)
似乎等于
0
。显然不是。也许
1.0
是一个实际上不是1的浮点数,它会被定义为
0

旁注:删除便士上的int函数并替换为
%.0f便士
有效

我猜这正是人们在说在处理金钱时不要使用浮点数时所说的

我也很确定,change/0.01等于1.0

嗯,不完全是。如果您尝试直接从Python解释器执行
change/0.01
,由于浮点错误,它会返回类似
0.999999999787
的内容。当然,如果你试着把它转换成整数,它会舍入到零

要避免这种情况,您可以尝试以下两种方法之一。您可以尝试使用Python中的模块,这样可以避免类似的浮点错误,也可以在开始时将
change
乘以100,这样您就可以处理整数值,而不是浮点数,并相应地修改其余代码。

我的完整代码:

cost = input("What is the cost in dollars? ")
money = input("Money given: ")
change = int(round(money - cost) * 100)

if change < 0:
    print("You didn't pay enough!")
    exit()

dollars = change / 100
change %= 100

quarters = change / 25
change %= 25

dimes = change / 10
change %= 10

nickels = change / 5
change %= 5

pennies = change

print("""Your change is:
    %i dollars
    %i quarters
    %i dimes
    %i nickels
    %i pennies
""" % (dollars, quarters, dimes, nickels, pennies))
cost=input(“成本是多少美元?”)
金钱=投入(“给予的金钱:”)
变更=整数(四舍五入(货币-成本)*100)
如果变化小于0:
打印(“你付的钱不够!”)
退出()
美元=零钱/100
变动%=100
四分之一=零钱/25
变动%=25
一角硬币=零钱/10
变动%=10
镍币=零钱/5
变动%=5
便士=零钱
打印(“”您的更改是:
%我喜欢美元
%我四分之一
%我一角硬币
%我要五分镍币
%我要一便士
“%”(美元、25美分、10美分、5美分、1美分)

%.0f
对数字执行舍入,而
%i
不执行舍入。还有,学数学

酷。我以为这就是发生的事。奇怪的是,python在执行
change/0.01
时会打印
1.0
。如果你问我,
round(money-cost,2)
的结果仍然是一个近似值,因为它是以百分之一美元为单位的,并且1/100不能用二进制浮点表示<代码>更改=整数((货币-成本)*100)更好。