2013-12-10 128 views
0

HI我正在运行一个简单的程序,一个组件是使用二次公式的二次函数求解器。我使用cmath模块的sqrt()方法来计算判别式的sqrt,即使判别式是正数,它仍然返回一个复数。尽管当我在tkinter标签中显示答案时,我使用%.3f作为浮点数,但它表示它不会接受它,因为它是一个复数。还有一个复数的占位符吗?python String Concatenation中的占位符

def quad(a,b,c): 
    global answers 
    print a,b,c 
    disc=b**2 
    ac4=4*a*c 
    disc-=ac4 
    sdisc=sqrt(disc) 
    b*=-1 
    a2=a*2 
    answer=[] 
    print a 
    if a!=0: 
     ans1=(b+sdisc)/a2 
     ans2=(b-sdisc)/a2 
     if ans1==ans2: 
      answer.append(ans1) 
      print type(ans1) 
      answers.config(text='%.3f' %ans1) 
     else: 
      answer.append(ans1) 
      answer.append(ans2) 
      answers.config(text='%.3f , %.3f' %(ans1,ans2)) 
    elif a==0: 
     answers.config(text='Not a Quadratic Function.') 

它返回复数如果为1,B,C = 0,0 ...是否CMATH无论什么返回复数?

熟悉python,虽然是复杂的数字,刚开始学习它们。

编辑: 我现在使用数学模块和特殊情况负输入,但是当我使用%.3f时,它不会允许我,因为它很复杂。 (我做了负数的负数的sqrt以获得积极的sqrt并乘以1j)是否有占位符来做到这一点? (如%C 23) 感谢

回答

0
r = cmath.sqrt(1) 
print('%f+i%f' % (r.real, r.imag)) 

如果您预计这个数字应该是真实的,可对其进行测试,并将其转换:

if abs(r.imag) < 1e-9: 
    r = r.real 
else: 
    print('Surprise: got a nonzero imaginary part!') 

,你应该将其替换1E-9任何小的值适合你的问题和浮点运算的固有缺陷。

0

有多种可能的解决方案。

首先,您可以使用math而不是cmath。它不会以任何明显的方式对程序的性能产生不利影响。

否则,如果您知道数量是真实的,你可以用complex.realcmath.sqrt(2).real

0

是否CMATH无论什么返回复数?

是。您需要正确打印复数,或使用常规的math.sqrt和特殊情况的负输入。

+0

我现在正在使用数学模块和特例负输入,但是当我使用%.3f时,它不会允许我,因为它很复杂。 (我做了负数的负数的sqrt以获得积极的sqrt并乘以1j)是否有占位符来做到这一点? (如%c) – user2658538

+0

@ user2658538:...所以,你建立了一个复杂的号码吗?这种做法违背了切换到非复杂数学模块的目的。没有复杂数字的格式说明符;您必须分别格式化“真实”和“图像”组件。它看起来像你想John1024的答案。 – user2357112

+0

但cmath总是返回复杂的,我想显示复杂和真实的数字都取决于答案是什么。如果有2个实数解或2个虚数数,我想显示它们。 – user2658538