ตัวอย่างเช่น:
9 / 5 #=> 1
1.8
แต่ผมคาดว่า ฉันจะรับผลลัพธ์ทศนิยม (ไม่ใช่จำนวนเต็ม) ที่ถูกต้องได้อย่างไร ทำไมมันกลับมา1
เลย?
ตัวอย่างเช่น:
9 / 5 #=> 1
1.8
แต่ผมคาดว่า ฉันจะรับผลลัพธ์ทศนิยม (ไม่ใช่จำนวนเต็ม) ที่ถูกต้องได้อย่างไร ทำไมมันกลับมา1
เลย?
คำตอบ:
มันกำลังทำการหารจำนวนเต็ม คุณสามารถสร้างหนึ่งในตัวเลขFloat
โดยเพิ่ม.0
:
9.0 / 5 #=> 1.8
9 / 5.0 #=> 1.8
.to_f
a.to_f / b
หากคุณกำลังหารจำนวนเต็มจำนวนฮาร์ดโค้ดสองตัว (ซึ่งอาจแปลก) การใช้9.0 / 5
ก็ดี
มันกำลังทำการหารจำนวนเต็ม คุณสามารถใช้to_f
เพื่อบังคับให้สิ่งต่าง ๆ เข้าสู่โหมดจุดลอยตัว:
9.to_f / 5 #=> 1.8
9 / 5.to_f #=> 1.8
สิ่งนี้จะทำงานหากค่าของคุณเป็นตัวแปรแทนที่จะเป็นตัวอักษร การแปลงค่าหนึ่งไปเป็นทศนิยมนั้นเพียงพอที่จะบีบบังคับนิพจน์ทั้งหมดเป็นเลขทศนิยม
นอกจากนี้ยังมีNumeric#fdiv
วิธีการที่คุณสามารถใช้แทน:
9.fdiv(5) #=> 1.8
คุณสามารถตรวจสอบได้ด้วย IRB:
$ irb
>> 2 / 3
=> 0
>> 2.to_f / 3
=> 0.666666666666667
>> 2 / 3.to_f
=> 0.666666666666667
คุณสามารถรวมmathn
โมดูลทับทิม
require 'mathn'
ด้วยวิธีนี้คุณจะสามารถทำการแบ่งได้ตามปกติ
1/2 #=> (1/2)
(1/2) ** 3 #=> (1/8)
1/3*3 #=> 1
Math.sin(1/2) #=> 0.479425538604203
วิธีนี้คุณจะได้รับส่วนที่แน่นอน (ชั้น Rational) Math.sin
จนกว่าคุณจะตัดสินใจที่จะใช้ดำเนินการที่ไม่สามารถแสดงเป็นเหตุผลที่ยกตัวอย่างเช่น
เปลี่ยนไป5
5.0
คุณได้รับการหารจำนวนเต็ม
Fixnum # to_r ไม่ได้กล่าวถึงที่นี่มันถูกนำมาใช้ตั้งแต่ทับทิม 1.9 มันแปลง Fixnum เป็นรูปแบบที่มีเหตุผล ด้านล่างนี้เป็นตัวอย่างการใช้งาน สิ่งนี้ยังสามารถแบ่งส่วนที่แน่นอนได้ตราบใดที่ตัวเลขทั้งหมดที่ใช้คือ Fixnum
a = 1.to_r #=> (1/1)
a = 10.to_r #=> (10/1)
a = a / 3 #=> (10/3)
a = a * 3 #=> (10/1)
a.to_f #=> 10.0
ตัวอย่างที่การดำเนินการลอยตัวบนจำนวนตรรกยะคลุมผลลัพธ์ที่จะลอย
a = 5.to_r #=> (5/1)
a = a * 5.0 #=> 25.0
def method; a - b/8; end
จะกลับมาผลจากการคำนวณจากวิธีการที่เป็นการแสดงออกสุดท้ายในการเรียกวิธีเป็นค่าตอบแทน