如何判断数字小数部分仅为.25或.75以执行对应代码分支?
问题:精确判断数字小数部分是否为.25或.75
我尝试编写一个简单的if-elif-else语句,根据数字执行不同操作,代码如下:
number = 25 if '.25' in str(number): number1 = number - 0.25, number + 0.25 print(number1) elif '.75' in str(number): number1 = number - 0.25, number + 0.25 print(number1) elif number == 0: numberformated = format(number, '.1f') print(numberformated) else: print(number)
问题是,当number为1.754这类数字时,会触发elif '.75' in str(number):分支,但我希望仅当数字的小数部分恰好是.75(或.25)时才执行该分支。例如number为17.753时,应执行else分支而非该elif分支,请问该如何实现?
解决方案
不要通过字符串匹配判断,改用数学运算结合浮点数精度处理的方式,这样可以精确识别小数部分恰好为.25或.75的情况:
方法1:计算小数部分并做精度容错判断
number = 1.75 # 提取小数部分,处理浮点数精度误差 decimal_part = number - int(number) # 判断是否接近0.25或0.75(用1e-9作为精度阈值) is_quarter = abs(decimal_part - 0.25) < 1e-9 is_three_quarter = abs(decimal_part - 0.75) < 1e-9 if is_quarter or is_three_quarter: number1 = (number - 0.25, number + 0.25) print(number1) elif number == 0: print(format(number, '.1f')) else: print(number)
方法2:通过乘以4判断是否为非整数的整数倍
number = 1.75 # 判断数字不是整数,且乘以4后接近整数(处理浮点数精度) if number != int(number) and abs((number * 4) - round(number * 4)) < 1e-9: number1 = (number - 0.25, number + 0.25) print(number1) elif number == 0: print(format(number, '.1f')) else: print(number)
说明
- 字符串匹配的问题在于:只要数字的字符串表示中包含
.25或.75子串就会触发分支,比如1.754的字符串是"1.754",其中包含.75,但它的小数部分实际是.754,不符合要求。 - 数学计算的方式直接针对小数部分的数值进行判断,同时加入
1e-9的精度阈值,是为了避免浮点数存储时的精度误差(比如1.75可能被存储为1.7499999999999998)。
内容的提问来源于stack exchange,提问作者JakeM
相关产品推荐
相关产品推荐

