为什么以及-1j
和0 - 1j
如何变成不同的字符串?
>>> a = -1j
>>> b = 0 - 1j
>>> a
(-0-1j)
>>> b
-1j
它们是相同类型的相同值:
>>> a == b
True
>>> type(a), type(b), type(a) is type(b)
(<class 'complex'>, <class 'complex'>, True)
但str
和repr
都将它们转换为不同的字符串:
>>> str(a), str(b)
('(-0-1j)', '-1j')
>>> repr(a), repr(b)
('(-0-1j)', '-1j')
为什么以及如何发生?
注意:这是在Python 3.6.4中。在Python 2.7.14中,它们都被转换为'-1j'
。
答案 0 :(得分:3)
declare @t1 table (id int, rowId int, value int);
insert into @t1 values
(2447234, 1, 456)
, (2447234, 2, 1394);
declare @t2 table (iden int identity primary key, id int, value int);
insert into @t2 (id, value) values
(2447234, 20)
, (2447234, 68)
, (2447234, -106)
, (2447234, 160)
, (2447234, 208)
, (2447234, 1500);
--select * from @t1;
--select * from @t2;
with cte as
( select t1.id, t1.rowId, t1.value as value1, t2.value as value2, t2.value as ssum , iter = 1, t2.iden as origIden, t2.iden
from @t1 t1
join @t2 t2
on t2.id = t1.id
union all
select t1.id, t1.rowId, t1.value1 , t2.value , t1.ssum + t2.value, iter + 1, t1.origIden , t2.iden
from cte t1
join @t2 t2
on t2.id = t1.id
and t2.iden > t1.iden
where t1.ssum + t2.value <= t1.value1
)
select * from cte
order by rowID, id, origIden, iter
的实际成分为a
,而-0.0
的实际成分为b
。字符串表示中省略了0.0
。
0.0
被视为-1j
,其中-(1j)
的实际成分为1j
。那个真实的组件被否定了。
在0.0
中,双方的实数分量为0,减法产生的实数为0。
在Python 2上,我认为0 - 1j
可能会遇到用于使-1j
或-2147483648
(依赖于平台)评估为int而不是long的特殊情况。特殊情况处理似乎导致-9223372036854775808
的实际组件。