Python tamsayı bölümü float verir


223
Python 3.1 (r31:73574, Jun 26 2009, 20:21:35) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 2/2
1.0

Bu amaçlandı mı? Şiddetle önceki sürümleri dönen hatırlıyorum int/int=int? Ne yapmalıyım, yeni bir bölme operatörü var mı yoksa her zaman yayınlamam mı gerekiyor?


31
Evet, bölüm 3.x'te böyle çalışır.
hughdbrown

2
İşte Python'un yaratıcısının yuvarlamanın nasıl çalıştığından bahseden bir yazı, sorunuzun ortogonal olduğunu, ancak ilginç buldum: python-history.blogspot.com/2010/08/…
Aaron D

@hughdbrown böylece tüm python 3 sürümü için esasen anlamına gelir ?
Charlie Parker

@hughdbrown: evet, PEP olan nihai hem kabul edilip uygulamaya anlam.
Jonas Byström

Yanıtlar:


285

Bir göz atın PEP-238 : Bölüm Operatör değiştirme

// işleci açıkça kat bölümü talep edebilecek.


10
@JonathanSternberg, python 2.0 için yazılmış tüm kodlar hariç. / Ve // rolünün geriye dönük uyumluluğu korumak için tersine çevrilmesi gerektiğini hissediyorum. Ayrıca, hemen hemen her dilde / tip korur. // daha sonra otomatik olarak şamandıra dönüştürmek değil, daha anlamlı olur.
thang

1
İkinci bölüm ("Ayrıca" dan sonra) mantıklıdır (diğer dillerle benzerlik gösterir), ancak ilk bölümle ilgili olarak, Python 3'ün tüm noktası Python 2 ile geriye dönük olarak DEĞİLDİR, daha ziyade Python ile ilgili bir takım sorunları düzeltmekti 2. Yeterli insan /, Python 3'te düzeltilmesi gereken bir dil tasarımı "hatası" nın yetersizliğini bulmuştur . Bu tartışmalı bir karar olabilir, ancak yeterince insan bunun doğru karar olduğunu düşündü. Beni değişimi seven grupta say. Hepimiz katılmıyorum kabul edebilir güzel. Şerefe. :)
Ray Toal

59

Hata! Hemen bulundu 2//2.


5
Detaylandırabilir misiniz?
blueFast

4
Bunu kullanmak float @ dangonfast değil, int çıktısı verir.
Ashish Ahuja

Bu negatif sayılar için işe yaramıyor gibi görünüyor. -1 // 5 dönüş -1 ve -5 // 5 dönüş -1.
01

@mschuett: bu beklenen bir şey ve Python 2 ile aynı sonuç.
Jonas Byström

1
Evet, biraz daha kazma yaptım ve bunu da öğrendim. Bununla birlikte, insanların iyi bir boyut sayısının, geldikleri dile bağlı olarak bunu fark etmediğini hayal ediyorum.
15'te mschuett

45

Umarım birisine anında yardımcı olabilir.

Python 2.7 ve Python 3'te Bölüm Operatörünün Davranışı

Python 2.7'de: Varsayılan olarak, bölme operatörü tamsayı çıktısı döndürür.

sonucu "temettü veya bölen" için çift ​​kat 1.0 elde etmek için

100/35 => 2 #(Expected is 2.857142857142857)
(100*1.0)/35 => 2.857142857142857
100/(35*1.0) => 2.857142857142857

Python 3'te

// => used for integer output
/ => used for double output

100/35 => 2.857142857142857
100//35 => 2
100.//35 => 2.0    # floating-point result if divsor or dividend real

1
Bu arada, 1.0 ile çarpmaya gerek yok. Sayılardan birinin bir şamandıra olması yeterlidir. Örneğin, 100 / 35.0 = 100.0 / 35 = 2.857142857142857
Tal J. Levy

21

Kabul edilen cevap zaten PEP 238'den bahsediyor . Sadece tüm PEP'i okumadan neler olup bittiğini merak edenler için perde arkasına hızlı bir bakış eklemek istiyorum.

Python gibi operatörler eşler +, -, *ve /özel fonksiyonlar, böyle mesela o a + beşdeğerdir

a.__add__(b)

Python 2'de bölünme ile ilgili olarak, orada sadece varsayılan olarak /eşleştiren __div__ve sonuç girişi tipleri bağlıdır (örneğin int, float).

Python 2.2 , bölüm semantiğini şu şekilde değiştiren __future__özelliği tanıttı division(TL; PEP 238'in DR'si):

  • /__truediv__"bölünmenin matematiksel sonucuna makul bir yaklaşım getirmesi" gereken haritalar (PEP 238'den alıntı)
  • //haritalar için __floordiv__tek katlı bir sonuç döndürmesi gerekir ki,/

Python 3.0 ile PEP 238 değişiklikleri varsayılan davranış haline geldi ve __div__Python'un nesne modelinde artık özel bir yöntem yok .

Aynı kodu Python 2 ve Python 3'te kullanmak istiyorsanız

from __future__ import division

ve PEP 238 semantik sopa /ve //.


0

Python3 belgelerine göre, python tamsayıya bölünürse tamsayı olması beklenmesine rağmen float üretecektir.

Yalnızca tamsayı yazdırmak için kullanın floor division method. Kat bölümü sıfıra yuvarlanıyor ve ondalık noktasını kaldırıyor.Represented by //

Bu nedenle, 2/2 yerine, 2//2

Ayrıca __future__, python2 veya python3 kullanılmasına bakılmaksızın bölümü içe aktarabilirsiniz .

Umarım yardımcı olur!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.