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.