gpt4 book ai didi

python - 为什么 QDoubleSpinBox 的精度有时高于其小数属性允许的精度?

转载 作者:行者123 更新时间:2023-12-01 00:41:48 27 4
gpt4 key购买 nike

在 PySide2 中,如果我创建一个 QDoubleSpinBox 并显式将其 decimals 属性设置为 2,将其 singleStep 属性设置为 0.1,然后通过 up/更改其值向下按钮,打印的值有时具有更高的精度。

为什么会这样?

虽然使用此值进行计算不一定会出现问题,但它会影响用户体验:

就我而言,如果 spinbox-value 为 0.0,我想禁用 QPushButton,否则启用它。如果旋转框值变得非常接近 0,按钮(以及旋转框的向下箭头)不会被禁用,尽管旋转框内的可读数字显示“0,00”。

<小时/>

我目前为解决用户体验所做的事情是:

int(self.spin.value()*100) > 0

而不是:

self.spin.value() > 0.0

这真的是最好的方法吗?

<小时/>

这是一个重现不良行为的小示例:

import sys
from PySide2 import QtWidgets

class Window(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.spin = QtWidgets.QDoubleSpinBox(self)
self.spin.setDecimals(2)
self.spin.setSingleStep(0.1)
self.button = QtWidgets.QPushButton(self)
self.button.move(0, 40)
self.spin.valueChanged.connect(self.on_spin_value_change)
self.show()

def on_spin_value_change(self, value):
print(value)
self.button.setEnabled(value > 0.0)


app = QtWidgets.QApplication(sys.argv)
window = Window()
sys.exit(app.exec_())

这是一个示例输出:

enter image description here

<小时/>

编辑:不,我的问题不仅仅是“如何在Python中比较 float ”。我要求找到一种方法来修复 QDoubleSpinBox 的用户体验,并解释为什么该值的内部表示与可见的不同。是的,选择不同的方式来比较 float 可以解决问题,但是使用另一个重载信号对我来说是更好的解决方案 - 如果我的问题没有被解决,我就不会被告知这个解决方案Qt/PySide 特定的。

最佳答案

问题是计算机内存中 float 的表示 wikipedia

添加到您的代码from math import isclose并更改按钮检查self.button.setEnabled(不是isclose(0,值,abs_tol=1e-9))

无需数学的其他解决方案是使用 abs 并将值与某个非常小的数字进行比较。self.button.setEnabled(abs(value) > 1e-9)

关于python - 为什么 QDoubleSpinBox 的精度有时高于其小数属性允许的精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57292315/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com