การปัดเศษทศนิยมใน Ruby


150

ฉันมีปัญหาในการปัดเศษ ฉันมีทุ่นซึ่งฉันอยากปัดให้เป็นทศนิยมหนึ่งร้อย อย่างไรก็ตามฉันสามารถใช้.roundซึ่งเปลี่ยนเป็น int เท่านั้นความหมาย2.34.round # => 2. มีวิธีเอฟเฟกต์ง่ายๆที่จะทำบางสิ่งเช่น2.3465 # => 2.35

คำตอบ:


181

เมื่อแสดงคุณสามารถใช้ (ตัวอย่าง)

>> '%.2f' % 2.3465
=> "2.35"

หากคุณต้องการเก็บไว้ปัดคุณสามารถใช้

>> (2.3465*100).round / 100.0
=> 2.35

2
ขอบคุณ ฉันไม่ทราบว่า sprintf จะดูแลการปัดเศษให้ฉัน sprintf '%.2f', 2.3465ยังใช้งานได้
Noah Sussman

66
value.round (2) ดีกว่าโซลูชันนี้
Kit Ho

12
โปรดทราบว่าการและ2.3000.round(2) => 2.3 sprintf '%.2f', 2.300 => 2.30ในความคิดของฉันนี้เป็นข้อบกพร่องในรอบ () หรือควรมีตัวเลือกในการรักษาศูนย์ต่อท้าย
Excalibur

14
@Excalibur 2.3000.round(2)เป็นตัวเลขไม่ใช่สตริง ไม่มีวิธีที่ตัวเลข2.3จะแตกต่างจาก2.30ดังนั้นจึงไม่มีวิธีที่จะมีตัวเลือกในการรักษาศูนย์ต่อท้าย คุณสามารถสร้างคลาส number_with_significance ของคุณเอง แต่เรามีสตริงอยู่แล้ว
Roobie Nuby

6
โปรดทราบว่าแม้ว่าจะใช้งานได้สำหรับทศนิยมสองตำแหน่ง แต่มีข้อบกพร่องใน'%.3f' % 1.2345(ทศนิยม 3 ตำแหน่งไม่ใช่ 2) !! เหมือนกันsprintfเช่นกัน ระวัง. ที่จะ=> 1.234 ไม่ กลับมา=> 1.235เป็นอย่างที่คาดหวัง (iow, หลังจากทศนิยมที่ 2, sprintf ปัด 5 ลงและเหลือเพียง 6 รอบเท่านั้น) นั่นเป็นเหตุผลที่ความคิดเห็นของ Kit Ho ด้านบนมีผู้โหวตมากกว่า 25 คน ปลอดภัยกว่าการใช้'%.3f' % 1.2345.round(3)ดังนั้นหมายเลขจะถูกปัดเศษอย่างถูกต้อง.roundก่อนแล้วจัดรูปแบบ (ด้วยศูนย์ต่อท้ายหากจำเป็น)
likethesky

392

ผ่านการโต้แย้งไปรอบที่มีจำนวนทศนิยมที่จะปัดเศษ

>> 2.3465.round
=> 2
>> 2.3465.round(2)
=> 2.35
>> 2.3465.round(3)
=> 2.347

8
นี่จะดูสมเหตุสมผลกว่าการคูณการปัดเศษและการหาร +1
ทำเครื่องหมาย Embling

3
อืมวิธีนี้ดูเหมือนจะไม่เป็นทับทิม 1.8.7 อาจจะเป็น 1.9?
Brian Armstrong

2
@ Brian นี้แน่นอนใน 1.9 และยังอยู่ในราง (ซึ่งคำถามนี้ได้รับการติดแท็กด้วย)
สตีฟ Weet

3
วิธีการปัดเศษ Ruby 1.8.7 ไม่มีความสามารถนี้การเพิ่มพารามิเตอร์การปัดเศษทศนิยมเป็นความสามารถ 1.9
bobmagoo

1
โปรดทราบว่าคุณไม่ได้รับค่าศูนย์ต่อท้ายด้วยสิ่งนี้ดังนั้น1.1.round(2)=> 1.1ไม่1.10
NotAnAmbiTurner


7

คุณสามารถเพิ่มวิธีใน 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

3

นอกจากนี้คุณยังสามารถระบุจำนวนลบเป็นอาร์กิวเมนต์ของ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



1

หากคุณต้องการแสดงมันฉันจะใช้ตัวช่วยnumber_with_precision หากคุณต้องการที่อื่นฉันจะใช้เป็น Steve Weet ชี้roundวิธี


1
โปรดทราบว่าnumber_with_precisionเป็นวิธีการ Rails เท่านั้น
Smar

0

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