วิธีการแบ่งส่วนใน Go


89

ฉันกำลังพยายามแบ่งส่วนง่ายๆใน Go

fmt.Println(3/10)

สิ่งนี้จะพิมพ์ 0 แทนที่จะเป็น 0.3 นี่เป็นเรื่องแปลก ใครช่วยบอกเหตุผลที่อยู่เบื้องหลังเรื่องนี้ได้ไหม ฉันต้องการดำเนินการทางคณิตศาสตร์ที่แตกต่างกันใน Go

ขอบคุณ

คำตอบ:


93

นิพจน์3 / 10เป็นนิพจน์คงที่ที่ไม่ถูกพิมพ์ ข้อกำหนด กล่าวเกี่ยวกับนิพจน์คงที่

หากตัวถูกดำเนินการของการดำเนินการไบนารีเป็นค่าคงที่ที่ไม่ได้พิมพ์ชนิดต่างๆการดำเนินการและสำหรับการดำเนินการที่ไม่ใช่บูลีนผลลัพธ์จะใช้ชนิดที่ปรากฏในภายหลังในรายการนี้: จำนวนเต็ม, รูน, จุดลอยตัว, เชิงซ้อน

เนื่องจาก3และ10เป็นค่าคงที่จำนวนเต็มที่ไม่ได้พิมพ์ค่าของนิพจน์จึงเป็นจำนวนเต็มที่ไม่ได้พิมพ์ ( 0ในกรณีนี้)

ตัวถูกดำเนินการตัวใดตัวหนึ่งต้องเป็นค่าคงที่จุดลอยตัวเพื่อให้ผลลัพธ์เป็นค่าคงที่จุดลอยตัว นิพจน์ต่อไปนี้ประเมินค่าคงที่ทศนิยมที่ไม่ได้พิมพ์0.3:

3.0 / 10.0
3.0 / 10
3 / 10.0

นอกจากนี้ยังสามารถใช้ค่าคงที่พิมพ์ได้ นิพจน์ต่อไปนี้ประเมินfloat64ค่าคงที่0.3:

float64(3) / float64(10)
float64(3) / 10
3 / float64(10)

พิมพ์ใด ๆ 0.3ของการแสดงออกดังกล่าวข้างต้นจะพิมพ์ ยกตัวอย่างเช่นการพิมพ์fmt.Println(3.0 / 10)0.3


ฉันกำลังรับข้อมูลโดยสมมติว่าเป็นเปอร์เซ็นต์ ตัวอย่างเช่นถ้าผู้ใช้ให้ 30 ฉันต้องแสดง 30/100 * somenumber ข้อมูลที่ป้อนจะเป็นจำนวนเต็มเสมอ วิธีการแบ่งส่วนในสถานการณ์นี้?
Vrushank Doshi

แปลงจำนวนเต็มเป็นตัวเลขทศนิยม
Cerise Limón

ฉันลอง fmt.Println (float64 (3/10)) แต่มันให้ฉัน 0
Vrushank Doshi

8
@VrushankDoshi: fmt.Println(float64(3) / float64(10))ให้0.3.
peterSO

22

ดังกล่าวโดย@Ceriseและตามข้อมูลจำเพาะ

ตัวดำเนินการทางคณิตศาสตร์ใช้กับค่าตัวเลขและให้ผลลัพธ์เป็นชนิดเดียวกับตัวถูกดำเนินการตัวแรก

ในกรณีนี้เฉพาะตัวถูกดำเนินการแรกเท่านั้นที่ต้องเป็นทศนิยม

fmt.Println(3.0/10)
fmt.Println(float64(3)/10)
// 0.3 0.3

ตัวอย่าง


ใช่ ตัวถูกดำเนินการแรก
SMMousavi

ไม่ประสบความสำเร็จเสมอไปในกรณีที่ตรวจพบ "10" เป็น int จะทำให้เกิดข้อผิดพลาดต่อไปนี้: การดำเนินการไม่ถูกต้อง: (ประเภท float64 และ int ที่ไม่ตรงกัน)
Feras
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.