"""2.5-2.7 课后练习参考答案：数字类型、运算符与实训。"""

from math import isclose


print("=" * 64)
print("第一部分：整数与浮点数")

order_count = 26
stock_change = -3
annual_sales = 1_250_000

print("订单数：", order_count, type(order_count))
print("库存变化：", stock_change, type(stock_change))
print("年销售额：", annual_sales, type(annual_sales))

remaining_orders = order_count - 3
print("退货后的订单数：", remaining_orders, type(remaining_orders))


print("\n第二部分：浮点与转换")

float_result = 0.1 + 0.2
print("0.1 + 0.2 =", float_result)
print("是否接近 0.3：", isclose(float_result, 0.3))

price = float("39.8")
quantity = int("3")
print(price, type(price), quantity, type(quantity))

print("int(3.9) =", int(3.9))
print('bool("False") =', bool("False"))


print("\n第三部分：算术、赋值与边界")

total_minutes = 125
hours = total_minutes // 60
minutes = total_minutes % 60
print(total_minutes, "分钟 =", hours, "小时", minutes, "分钟")

stock = 100
stock -= 8
stock += 20
print("当前库存：", stock)

for value in [99, 100, 101]:
    strict = value > 100
    inclusive = value >= 100
    print(value, "> 100：", strict, ">= 100：", inclusive)


print("\n第四部分：逻辑与成员运算")

sales_quantity = 125
return_quantity = 8
unit_price = 199.0
channel = "直播"
allowed_channels = {"直播", "搜索"}

return_rate = return_quantity / sales_quantity
basic_condition = (
    sales_quantity >= 100
    and unit_price < 200
    and return_rate <= 0.10
)
is_priority = basic_condition and channel in allowed_channels

print(f"退单率：{return_rate * 100:.2f}%")
print("基础条件：", basic_condition)
print("是否重点商品：", is_priority)


print("\n第五部分：时间间隔计算器")


def time_interval(start_hour, start_minute, end_hour, end_minute):
    """返回两个时刻之间的小时数和分钟数，允许跨午夜。"""
    start_total = start_hour * 60 + start_minute
    end_total = end_hour * 60 + end_minute
    interval = (end_total - start_total) % (24 * 60)
    return interval // 60, interval % 60


print("17:10 -> 18:15：", time_interval(17, 10, 18, 15))
print("23:50 -> 00:20：", time_interval(23, 50, 0, 20))


print("\n第六部分：BMI 公式练习")


def calculate_bmi(weight_kg, height_m):
    """只计算 BMI 数值，不提供医学诊断。"""
    if height_m <= 0:
        raise ValueError("身高必须大于 0")
    return weight_kg / (height_m ** 2)


bmi = calculate_bmi(60, 1.70)
print(f"BMI 计算结果：{bmi:.2f}")


print("\n第七部分：解释与自检")

# TODO 16：
# / 是普通除法，结果通常带小数；// 是向下取整除法，得到完整的组数；
# % 是取余，得到剩余部分。125 // 60 和 125 % 60 合起来得到 2 小时 5 分钟。

# TODO 17：
# 括号明确先后顺序和业务口径。例如先扣退单再乘单价应写为
# (sales_quantity - return_quantity) * unit_price；没有括号会改变含义。

# 自检：
# [x] 能解释 int(3.9) 与 bool("False") 的结果。
# [x] 能用 99/100/101 检查边界。
# [x] 时间间隔普通与跨午夜样例都正确。
# [x] BMI 公式检查了身高为正，且不输出医疗诊断。
