cnouge 发表于 2024-3-2 23:34

PYTHON中做计算器的问题

9岁的娃儿在自学PYTHON做计算器,我虽然是计算机专业,参加工作之后都与软件无关,25年前的大学编程学习早就还给老师了。逻辑能帮他理顺,但是实际解决小问题还是不行
现在出了点小问题,求教各位大佬
1.计算器中用 eval来计算结果,但是计算小数乘法会有问题,比如1.2*9结果会等于10.799999999999,像这种问题如何解决?

2.计算器目前只能用鼠标,如何按键盘的数字键来驱动计算器的相应按钮?应该用什么函数或者命令?

3.能否推荐一本书自学,目前是在看B站的视频..

Jvin 发表于 2024-3-2 23:58

四舍五入和键盘钩子

我心飞翔1995 发表于 2024-3-3 00:02

使用decimal实现精准计算小数,直接用浮点数是失真的

cnouge 发表于 2024-3-3 00:03

Jvin 发表于 2024-3-2 23:58
四舍五入和键盘钩子

键盘钩子刚刚百度到了,看明白了,感谢,晚点试试PYHOOK
不过前面这个四舍五入好像操作起来比较麻烦
我试了round和Decimal好像都有点问题,不知道是不是我使用的问题

爱飞的猫 发表于 2024-3-3 04:01

cnouge 发表于 2024-3-3 00:03
键盘钩子刚刚百度到了,看明白了,感谢,晚点试试PYHOOK
不过前面这个四舍五入好像操作起来比较麻烦
我 ...

试试将小数对应的字符串传入 `Decimal`,而非已经解析为 `float` 类型的数值。

```text
>>> Decimal(1.2)
Decimal('1.1999999999999999555910790149937383830547332763671875')
>>> Decimal('1.2')
Decimal('1.2')
```

回到你说的案例:

```py
>>> result = Decimal('1.2') * Decimal('9')
>>> print(f'1.2 * 9 = {result}')
1.2 * 9 = 10.8
```

是可以得到正确的答案。

---

> 如何按键盘的数字键来驱动计算器的相应按钮?

这个需要参考你使用的图形界面框架,通常不需要对 Windows 窗口事件进行 Hook。

例如 Python 自带的 GUI 框架是 Tk,可以绑定 `<KeyPress>` 事件来获取在这个窗口输入的按键。

下面是一个简单的例子:

```py
# 处理 Windows 下的 HiDPI 窗口渲染
try:
    from ctypes import windll

    windll.shcore.SetProcessDpiAwareness(1)
except:
    pass# ignored

# tk 框架代码开始

import tkinter as tk

window = tk.Tk()
window.geometry("400x200")


def key_press(e):
    print(f'处理按键事件 {e}')

    # 将字符插入或删除
    if e.keysym == 'BackSpace':
      new_text = lb_input.cget('text')[:-1]
    else:
      new_text = lb_input.cget('text') + e.char

    # 显示新的字符串
    lb_input.config(text=new_text)


lb_info = tk.Label(window, text="按下按键来预览")
lb_info.pack(pady=20)

lb_input = tk.Label(window, text="")
lb_input.pack(pady=20)

# 绑定事件到窗口
window.bind('<KeyPress>', key_press)

# 窗体事件循环
window.mainloop()
```

效果如下,在窗口按下按键来更新 `lb_input` 标签内容:

![](https://imgsrc.baidu.com/forum/pic/item/8d5494eef01f3a292b61aaf4df25bc315c607c5a.png)

sai609 发表于 2024-3-3 13:09

大厂需要你九岁的娃儿

eeehaha 发表于 2024-3-3 14:26

嗯不错,学的知识要还回老师,感恩老师
我也非计算机专业,也在看b站视频,小孩子学点python挺好的

cnouge 发表于 2024-3-3 23:32

爱飞的猫 发表于 2024-3-3 04:01
试试将小数对应的字符串传入 `Decimal`,而非已经解析为 `float` 类型的数值。

```text


感谢版主大大
关于浮点计算的问题,娃儿自己解决了
大概是加了一段代码
def __correct_true_num__(float_num):
    """纠正错误数字"""
    minus_10 = 0
    while True:
      if abs(float_num - float(round(float_num))) < 1 / 1000000:
            break
      float_num *= 10
      minus_10 += 1
    _correct_true_num_ = float(round(float_num))
    _correct_true_num_ /= 10 ** minus_10
    return _correct_true_num_

2按键方面,晚上让娃儿看了下版主大大的回复,应该受到了启发,急不可耐的想马上改,被我按住了,下个周末实施
完整完成之后再发出来请版主大大指导。
先感谢!

爱飞的猫 发表于 2024-3-3 23:39

cnouge 发表于 2024-3-3 23:32
感谢版主大大
关于浮点计算的问题,娃儿自己解决了
大概是加了一段代码


不用谢。

使用后期修正小数的方法可能会对真正的高精度小数进行误处理导致精度下降,如果对精度有要求的话还是重构使用 decimal 类型可能会更加适合。
不过只是拿来练手做的的计算器,估计也不太需要考虑这个问题就是了…

夜雨微澜 发表于 2024-3-7 22:13

1、decimal标准库里面的Decimal类,或者模拟竖式手搓高精度
2、一些关于键盘的标准库或者扩展库,这些能够上网查询。
页: [1]
查看完整版本: PYTHON中做计算器的问题