จะทำให้การหาร 2 int สร้างลอยแทน int อื่นได้อย่างไร


149

ในแบบอื่น Bruce Eckels ออกกำลังกายในการคำนวณความเร็วv = s / tที่ s และ t เป็นจำนวนเต็ม ฉันจะทำให้มันเป็นอย่างไรเพื่อให้กองแตกออกมาลอย?

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 ดำเนินการหารแล้วแปลงผลลัพธ์ให้เป็นแบบลอย float v = (float) s / t ปลดเปลื้องเพื่อลอยจากนั้นทำการหาร
Juan Carlos Iturriagagoitia

คำตอบ:


307

เพียงแค่โยนหนึ่งในสองตัวถูกดำเนินการลอย

v = (float)s / t;

การขว้างมีความสำคัญมากกว่าการหารดังนั้นเกิดขึ้นก่อนการแบ่ง

ตัวถูกดำเนินการอื่นจะถูกส่งไปยังการลอยโดยคอมไพเลอร์โดยอัตโนมัติเนื่องจากกฎบอกว่าถ้าตัวถูกดำเนินการใดเป็นประเภทของจุดลอยตัวการดำเนินการจะเป็นการดำเนินการลอยตัวแม้ว่าตัวถูกดำเนินการอื่นเป็นส่วนประกอบ ข้อกำหนดภาษา Java, §4.2.4และ§15.17


8
Grrr ฉันใช้เวลาประมาณ 30 นาทีจนกระทั่งฉันพบสิ่งนี้และคิดออก ง่ายมาก : D
Rihards

โดยเฉพาะอย่างยิ่งกฎนี้ถูกกล่าวถึงที่นี่: ผู้ประกอบการหลายหลากดังนั้นให้มันยืนที่นี่สำหรับการอ้างอิงในอนาคต
ควอนตัม

5
(สำหรับทุกคนที่เจอคำถามนี้ในภายหลังลิงก์ที่ให้มาจะเสียหายลิงก์ใหม่คือ: docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4และdocs oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17 )
Steve Haley

13

ลอง:

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

การหล่อ ints ให้ลอยจะช่วยให้การแบ่งจุดลอยตัวเกิดขึ้น

คุณเพียงแค่ต้องทำการขว้างมันเท่านั้น


ฉันไม่รู้มันเหมือนการบอกว่าคุณควรใช้ longs แทน iof ints
Jakub Zaverka

4

ส่งหนึ่งในจำนวนเต็มไปที่โฟลตเพื่อบังคับให้การดำเนินการเสร็จสิ้นด้วยคณิตศาสตร์จุดลอย มิฉะนั้นต้องใช้เลขจำนวนเต็มเสมอ ดังนั้น:

v = (float)s / t;


3

คุณสามารถร่ายเศษหรือส่วนเพื่อลอย ...

การดำเนินการ int มักจะคืนค่า int ดังนั้นคุณต้องเปลี่ยนหนึ่งในหมายเลขการดำเนินการ


1
โดยปกติ? หากพวกเขากลับมาเลยพวกเขาจะกลับมา int
Matthew Flaschen

3

คุณสามารถร่ายแม้แต่หนึ่งในนั้นได้ แต่เพื่อความมั่นคงคุณอาจต้องการใช้ทั้งสองอย่างอย่างชัดเจนเพื่อให้บางอย่างเช่น v = (float) s / (float) t ควรทำงาน


1

มาตรฐาน JLS

JLS 7 15.17.2 ผู้ดำเนินการกอง /พูดว่า:

การหารจำนวนเต็มปัดเศษเป็น 0 นั่นคือความฉลาดทางที่เกิดขึ้นสำหรับตัวถูกดำเนินการ n และ d ซึ่งเป็นจำนวนเต็มหลังจากการเลื่อนระดับเลขฐานสอง (§5.6.2) เป็นค่าจำนวนเต็ม q ซึ่งมีขนาดใหญ่ที่สุดเท่าที่จะเป็นไปได้ ≤ | n | ยิ่งกว่านั้น q จะเป็นบวกเมื่อ | n | ≥ | d | และ n และ d มีเครื่องหมายเหมือนกัน แต่ q เป็นลบเมื่อ | n | ≥ | d | และ n และ d มีเครื่องหมายตรงกันข้าม

นี่คือเหตุผล 1/2ไม่ให้ลอย

การแปลงเพียงอันใดอันหนึ่งให้ลอยเหมือนอย่าง(float)1/2พอเพียงเพราะ15.17 ผู้ประกอบการ Multiplicativeพูดว่า:

การส่งเสริมการขายแบบไบนารีจะดำเนินการกับผู้ดำเนินการ

และ5.6.2 โปรโมชั่นตัวเลขไบนารีพูดว่า:

  • หากตัวถูกดำเนินการอย่างใดอย่างหนึ่งเป็นประเภทคู่อื่น ๆ จะถูกแปลงเป็นสองเท่า
  • มิฉะนั้นถ้าตัวถูกดำเนินการตัวใดตัวหนึ่งเป็นชนิดลอยส่วนอีกตัวจะถูกแปลงเป็นแบบลอย

0

โยนหนึ่งในจำนวนเต็ม / ทั้งจำนวนเต็มเพื่อลอยเพื่อบังคับให้การดำเนินการเสร็จสิ้นด้วยคณิตศาสตร์จุดลอย มิฉะนั้นต้องการเลขจำนวนเต็มเสมอ ดังนั้น:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.