ฉันมีปัญหาในการปัดเศษ ฉันมีทุ่นซึ่งฉันอยากปัดให้เป็นทศนิยมหนึ่งร้อย อย่างไรก็ตามฉันสามารถใช้.roundซึ่งเปลี่ยนเป็น int เท่านั้นความหมาย2.34.round # => 2. มีวิธีเอฟเฟกต์ง่ายๆที่จะทำบางสิ่งเช่น2.3465 # => 2.35
ฉันมีปัญหาในการปัดเศษ ฉันมีทุ่นซึ่งฉันอยากปัดให้เป็นทศนิยมหนึ่งร้อย อย่างไรก็ตามฉันสามารถใช้.roundซึ่งเปลี่ยนเป็น int เท่านั้นความหมาย2.34.round # => 2. มีวิธีเอฟเฟกต์ง่ายๆที่จะทำบางสิ่งเช่น2.3465 # => 2.35
คำตอบ:
เมื่อแสดงคุณสามารถใช้ (ตัวอย่าง)
>> '%.2f' % 2.3465
=> "2.35"
หากคุณต้องการเก็บไว้ปัดคุณสามารถใช้
>> (2.3465*100).round / 100.0
=> 2.35
2.3000.round(2) => 2.3 sprintf '%.2f', 2.300 => 2.30ในความคิดของฉันนี้เป็นข้อบกพร่องในรอบ () หรือควรมีตัวเลือกในการรักษาศูนย์ต่อท้าย
2.3000.round(2)เป็นตัวเลขไม่ใช่สตริง ไม่มีวิธีที่ตัวเลข2.3จะแตกต่างจาก2.30ดังนั้นจึงไม่มีวิธีที่จะมีตัวเลือกในการรักษาศูนย์ต่อท้าย คุณสามารถสร้างคลาส number_with_significance ของคุณเอง แต่เรามีสตริงอยู่แล้ว
'%.3f' % 1.2345(ทศนิยม 3 ตำแหน่งไม่ใช่ 2) !! เหมือนกันsprintfเช่นกัน ระวัง. ที่จะ=> 1.234 ไม่ กลับมา=> 1.235เป็นอย่างที่คาดหวัง (iow, หลังจากทศนิยมที่ 2, sprintf ปัด 5 ลงและเหลือเพียง 6 รอบเท่านั้น) นั่นเป็นเหตุผลที่ความคิดเห็นของ Kit Ho ด้านบนมีผู้โหวตมากกว่า 25 คน ปลอดภัยกว่าการใช้'%.3f' % 1.2345.round(3)ดังนั้นหมายเลขจะถูกปัดเศษอย่างถูกต้อง.roundก่อนแล้วจัดรูปแบบ (ด้วยศูนย์ต่อท้ายหากจำเป็น)
ผ่านการโต้แย้งไปรอบที่มีจำนวนทศนิยมที่จะปัดเศษ
>> 2.3465.round
=> 2
>> 2.3465.round(2)
=> 2.35
>> 2.3465.round(3)
=> 2.347
1.1.round(2)=> 1.1ไม่1.10
คุณสามารถใช้วิธีนี้ในการปัดเศษเป็น precison ..
//to_f is for float
salary= 2921.9121
puts salary.to_f.round(2) // to 2 decimal place
puts salary.to_f.round() // to 3 decimal place
คุณสามารถเพิ่มวิธีใน Class Float ได้ฉันเรียนรู้สิ่งนี้จาก stackoverflow:
class Float
def precision(p)
# Make sure the precision level is actually an integer and > 0
raise ArgumentError, "#{p} is an invalid precision level. Valid ranges are integers > 0." unless p.class == Fixnum or p < 0
# Special case for 0 precision so it returns a Fixnum and thus doesn't have a trailing .0
return self.round if p == 0
# Standard case
return (self * 10**p).round.to_f / 10**p
end
end
นอกจากนี้คุณยังสามารถระบุจำนวนลบเป็นอาร์กิวเมนต์ของroundวิธีการปัดเศษเป็นพหุคูณที่ใกล้เคียงที่สุดของ 10, 100 และอื่น ๆ
# Round to the nearest multiple of 10.
12.3453.round(-1) # Output: 10
# Round to the nearest multiple of 100.
124.3453.round(-2) # Output: 100
def rounding(float,precision)
return ((float * 10**precision).round.to_f) / (10**precision)
end
แล้ว(2.3465*100).round()/100.0ไงล่ะ
หากคุณต้องการแสดงมันฉันจะใช้ตัวช่วยnumber_with_precision หากคุณต้องการที่อื่นฉันจะใช้เป็น Steve Weet ชี้roundวิธี
number_with_precisionเป็นวิธีการ Rails เท่านั้น
สำหรับ ruby 1.8.7 คุณสามารถเพิ่มรหัสต่อไปนี้ในโค้ดของคุณ:
class Float
alias oldround:round
def round(precision = nil)
if precision.nil?
return self
else
return ((self * 10**precision).oldround.to_f) / (10**precision)
end
end
end
sprintf '%.2f', 2.3465ยังใช้งานได้