Steven D'Aprano wrote:
That's because you need to promote one of them to a float so you get a
floating-point result:

   >>> 1/2 * 1/2
   0
   >>> 1/2 * 1/2.0
   0.0

Oh...wait ;-)

Tim, I'm sure you know the answer to this, but for the benefit of the Original Poster, the problem is that you need to promote *both* divisions to floating point. Otherwise one of them will give int 0, which gives 0.0 when multiplied by 0.5.

1.0/2 * 1/2.0
0.25

You can get away with just promoting one of them...you just have to promote the _correct_ one (one involved in the first division) so that its promotion-of-subresult-to-float carries into all subsequent operations/operators:

  >>> 1/2 * 1/2 # (((1/2)*1)/2)==(((0)*1)/2) in 2.x
  0
  >>> 1/2 * 1/2.0 # (((1/2)*1)/2.0)==(((0)*1)/2.0) in 2.x
  0.0
  >>> 1/2 * 1.0/2 # (((1/2)*1.0)/2)==(((0)*1.0)/2) in 2.x
  0.0
  >>> 1/2.0 * 1/2 # (((1/2.0)*1)/2)
  0.25
  >>> 1.0/2 * 1/2 # (((1.0/2)*1)/2)
  0.25

I'd rather be explicit in *real* code that I'd write and explicitly float'ify constants or float() integer variables. The OP's question was both OT and pretty basic middle-school math that google would have nicely answered[1] so IMHO warranted a bit of fun. :)

-tkc

[1]
http://www.google.com/search?q=1%2F2+*+1%2F2



--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to