Python 中模运算和负浮点数的奇怪行为

Strange Behaviour with Modulo Operation and Negative Floating Point Numbers in Python

提问人:AlephZHR0 提问时间:6/13/2023 最后编辑:TylerHAlephZHR0 更新时间:10/11/2023 访问量:39

问:

负数的 mod 操作未按预期工作。 我试图获取一个数字的浮点部分,我曾经得到它,一直在工作,直到它是负数,当负数时,它以一种奇怪的方式工作,只有在运行时,当我在终端上测试它时,两个符号(+或-)都按预期工作,但是当进入程序时,它工作错误, 我看到有人在谈论整数,并建议使用 ,但没有奏效,无论哪种方式我都遇到了同样的问题。num % 1num % 1.0

工作不正常,它正在返回但它应该返回(浮动部分)time_difference_minutes % 10.71428571428571260.285714285714287


奇怪的是,当我直接在提示中执行此操作时,它起作用了,而不是我在新文件上再次做了这个片段并起作用了,我得到了预期的,但是一旦我添加了“-”信号,它又开始发生,但每次输出都是一样的,我注意到它每次出错,而且我没有找到任何具体的解释, 我注意到的另一点是它在带有“-”信号的终端上工作,就在程序运行时,它返回错误。print(4.285714285714287 % 1)


我使用 abs() 来解决问题,但我真的很想了解这里出了什么问题。


代码示例:

# Constants
AVENUE_LENGTH_KM = 22.5
OLD_SPEED_KMH = 70
NEW_SPEED_KMH = 90

# Calculations
time_taken_old_speed_hours = AVENUE_LENGTH_KM / OLD_SPEED_KMH
time_taken_new_speed_hours = AVENUE_LENGTH_KM / NEW_SPEED_KMH

time_difference_hours = time_taken_new_speed_hours - time_taken_old_speed_hours
time_difference_minutes = time_difference_hours * 60
time_difference_seconds = time_difference_minutes * 60

# Output
print("{:.2f} hours".format(time_difference_hours))
print("{:.0f} minutes and {:.0f} seconds".format(
    time_difference_minutes, (time_difference_minutes % 1) * 60))
print("{:.0f} seconds".format(time_difference_seconds))
python-3.x 浮点 python-3.11

评论

0赞 chux - Reinstate Monica 6/13/2023
旁白:在 C 中,是余数,而不是数。差异%fmod()
0赞 AlephZHR0 6/13/2023
我写错了,谢谢你的指正!
0赞 chux - Reinstate Monica 6/13/2023
需要明确的是,您的值约为 -4.28571 吗?...所以你要问的是为什么是 0.7142857142857126 而不是 0.285714285714287 或 -0.285714285714287?time_difference_minutes-4.285714285714287 % 1
0赞 AlephZHR0 6/16/2023
我认为使用 %1 应该只给我数字的小数部分,因为它会完全除以整数部分。当我在终端上尝试时,它工作正常。但是当我在程序中使用它 (x % 1) 时,我得到的结果对我来说没有意义。

答:

0赞 Mark Ransom 6/13/2023 #1

Python 始终保持以下关系: .由于地板除法向下舍入为负数,因此模量会进行调整以补偿。a//b * b + a%b == a