2 ints'lik bölmenin başka bir int yerine bir float üretmesini nasıl sağlayabilirim?


155

Başka bir Bruce Eckels hız hesaplama alıştırmasında v = s / ts ve t tamsayılardır. Bölümün bir şamandırayı kaldırması için nasıl yaparım?

class CalcV {
  float v;
  float calcV(int s, int t) {
    v = s / t;
    return v;
  } //end calcV
}

public class PassObject {

  public static void main (String[] args ) {
    int distance;
    distance = 4;

    int t;
    t = 3;

    float outV;

    CalcV v = new CalcV();
    outV = v.calcV(distance, t);

    System.out.println("velocity : " + outV);
  } //end main
}//end class

float v = s / t bölme işlemini gerçekleştirir ve ardından sonucu bir kayan noktaya dönüştürür. float v = (float) s / t float'a atar ve sonra bölme işlemini gerçekleştirir.
Juan Carlos Iturriagagoitia

Yanıtlar:


319

İlk önce iki işlenenden birini bir float'a çevirin.

v = (float)s / t;

Oyuncular, bölümden daha yüksek önceliğe sahiptir, bu nedenle bölümden önce gerçekleşir.

Diğer işlenen, derleyici tarafından otomatik olarak bir float'a dönüştürülecektir çünkü kurallar, işlenenlerden birinin kayan nokta türünde olması durumunda, diğer işlenen integral olsa bile işlemin bir kayan nokta işlemi olacağını söyler. Java Language Specification, §4.2.4 ve §15.17


8
Grrr, bunu bulup çözene kadar yaklaşık 30 dakika sürdü. Çok basit. : D
Rihards

Daha spesifik olarak, bu özel kural burada belirtilmiştir: Çarpımsal Operatörler , bu yüzden gelecekte referans için burada durmasına izin verin.
kuantum

5
(Bu soruyla daha sonra karşılaşan herkes için, verilen bağlantılar bozuktur. Yeniler şunlardır: docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4 ve docs. oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17 )
Steve Haley

13

Deneyin:

v = (float)s / (float)t;

İntleri yüzer hale getirmek, kayan nokta bölünmesinin gerçekleşmesine izin verecektir.

Yine de gerçekten sadece bir tane yapmanız gerekiyor.


Bilmiyorum, ints yerine uzun kullanmalısın demek gibi.
Jakub Zaverka

4

İşlemi kayan nokta matematiği ile yapılmaya zorlamak için tam sayılardan birini bir float'a çevirin. Aksi halde tamsayı matematik her zaman tercih edilir. Yani:

v = (float)s / t;


3

Payı veya paydayı yüzdürmek için çevirebilirsiniz ...

int işlemler genellikle int döndürür, bu nedenle işlem numaralarından birini değiştirmeniz gerekir.


1
Genelde? Eğer geri dönerlerse, int dönecekler.
Matthew Flaschen

3

Bunlardan yalnızca birini bile çevirebilirsiniz, ancak tutarlılık için ikisini de açıkça çevirmek isteyebilirsiniz, böylece v = (float) s / (float) t gibi bir şey çalışmalıdır.


1

JLS Standardı

JLS 7 15.17.2. Bölüm Operatörü / diyor ki:

Tamsayı bölmesi 0'a yuvarlanır. Yani, ikili sayısal terfiden sonra tamsayı olan n ve d işlenenleri için üretilen bölüm (§5.6.2), | d · q | 'u tatmin ederken büyüklüğü olabildiğince büyük olan bir tamsayı değeri q'dur. ≤ | n |. Ayrıca q, | n | olduğunda pozitiftir. ≥ | d | ve n ve d aynı işarete sahiptir, ancak | n | olduğunda q negatiftir ≥ | d | ve n ve d zıt işaretlere sahiptir.

Bu yüzden 1/2şamandıra vermez.

Bunlardan birini float'a dönüştürmek (float)1/2yeterli çünkü 15.17. Çarpımsal Operatörler diyor ki:

İşlenenler üzerinde ikili sayısal yükseltme gerçekleştirilir

ve 5.6.2. İkili Sayısal Promosyon diyor ki:

  • İşlenenlerden biri double türündeyse, diğeri double türüne dönüştürülür.
  • Aksi takdirde, işlenenlerden biri float tipindeyse, diğeri float'a dönüştürülür

0

İşlemi kayan noktalı Math ile yapılmaya zorlamak için tamsayılardan birini / her iki tamsayıyı float olarak çevirin. Aksi takdirde tamsayı Math her zaman tercih edilir. Yani:

1. v = (float)s / t;
2. v = (float)s / (float)t;

0

Bunu dene:

class CalcV 
{
      float v;
      float calcV(int s, int t)
      {
          float value1=s;
          float value2=t;
          v = value1 / value2;
          return v;
      } //end calcV
}
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.