ฉันมีปัญหาในการปัดเศษ ฉันมีทุ่นซึ่งฉันอยากปัดให้เป็นทศนิยมหนึ่งร้อย อย่างไรก็ตามฉันสามารถใช้.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
ยังใช้งานได้