คุณปัดทศนิยมเป็นทศนิยมสองตำแหน่งใน jruby ได้อย่างไร


172

JRuby 1.6.x คุณปัดทศนิยมเป็นทศนิยมใน jruby ได้อย่างไร

number = 1.1164
number.round(2)

The above shows the following error
wrong number of arguments (1 for 0)

ฉันจะปัดเศษทศนิยมนี้เป็นทศนิยม 2 ตำแหน่งได้อย่างไร

คำตอบ:


87

Float # round สามารถรับพารามิเตอร์ใน Ruby 1.9 ไม่ใช่ใน Ruby 1.8 ค่าเริ่มต้น JRuby 1.8 แต่มันก็เป็นความสามารถในการทำงานในโหมด 1.9


1
ฉันรู้ว่ามันไม่ได้เป็นความตั้งใจของแซมที่จะปัดเศษตัวเลขเพื่อจุดประสงค์ในการนำเสนอบางอย่างเช่นสกุลเงิน แต่โปรดทราบว่าการใช้ #round (ความแม่นยำ) จะไม่ทำงานตามที่ตั้งใจถ้าคุณพยายามทำ (3) .round (2) # => 3.0 ไม่ใช่ 3.00) หากต้องการรับสิ่งนี้โปรดดูคำตอบจาก Theo ด้านล่าง
ช่างทำกุญแจ

290
(5.65235534).round(2)
#=> 5.65

12
(5.6).round(2)กำลังกลับมาเพียง 5.6
Bala Karthik

3
ดูเหมือนว่าสมเหตุสมผลแล้วตัวยึดตำแหน่งศูนย์พิเศษยังคงอยู่ที่นั่นมองไม่เห็น
boulder_ruby

@BalaKarthik นั่นเป็นเหตุผลที่ว่าทำไมฉันถึงใช้โซลูชันนี้โดย Theo มันปัดอย่างถูกต้อง (ยกเว้นว่าคุณกำลังผ่านทศนิยม 3 ตำแหน่งด้วยเหตุผลแปลก ๆ ดูความคิดเห็น) ดังนั้นนี่จึงเป็นทางออกที่ดีกว่าหากคุณกำลังมองหาเอาต์พุตสตริง
Dylan Vander Berg

ถูกต้องแล้ว ฉันสร้างละติจูดและลองจิจูดแบบสุ่มดังนั้นฉันจึงใช้ number.round (6) สำหรับ 6 หลัก
gsumk

199

sprintf('%.2f', number)เป็นวิธีการจัดรูปแบบตัวเลขที่ลึกลับ แต่ทรงพลังมาก ผลลัพธ์จะเป็นสตริงเสมอ แต่เนื่องจากคุณปัดเศษฉันถือว่าคุณทำเพื่อการนำเสนออยู่แล้ว sprintfสามารถจัดรูปแบบจำนวนเท่าใดก็ได้ตามที่คุณต้องการและอีกมากมาย

เอกสาร sprintf ฉบับเต็ม: http://www.ruby-doc.org/core-2.0.0/Kernel.html#method-i-sprintf


79
'%.2f' % numberยังเห็นได้บ่อยกว่าอย่างน้อยก็ในงานของฉัน
Michael Kohl

6
@MichaelKohl คู่มือสไตล์ rubyโปรดปรานsprintf(หรือformat) มากกว่า%รุ่น การให้เหตุผลบางอย่างที่กล่าวถึงที่นี่ส่วนใหญ่เกี่ยวกับความสามารถในการอ่าน ไม่ว่าเราทุกคนจะต้องปฏิบัติตามคำแนะนำสไตล์เพียงแค่ให้เหตุผลบางอย่าง :)
ลูซี่เบน

3
โปรดทราบว่าหลังจากทศนิยมลำดับที่ 3 แล้ว sprintf ปัดเศษขึ้นเป็น 6 ไม่ใช่ใน 5 ตัวอย่างเช่น sprintf ("%. 3f", 1.2225) จะเป็น "1.222", sprintf ("%. 3f", 1.2226) จะเป็น "1.223" "ถ้าเป็นสิ่งที่สำคัญสำหรับคุณลองใช้ #round
ecoding5

แต่0.566666666666666รอบถึง0.57
อันวาร์

"%.2f"ปัดเศษ5ขึ้นแทนที่จะเป็นขึ้นมีวิธีใดที่จะแก้ไขได้ไหม
Mirror318

3

แก้ไข

หลังจากได้รับคำติชมดูเหมือนว่าโซลูชันดั้งเดิมจะไม่ทำงาน นั่นเป็นเหตุผลที่ปรับปรุงคำตอบเป็นหนึ่งในข้อเสนอแนะ

def float_of_2_decimal(float_n) 
  float_n.to_d.round(2, :truncate).to_f
end

คำตอบอื่น ๆ อาจใช้งานได้ถ้าคุณต้องการที่จะปัดเศษทศนิยม 2 ตำแหน่ง แต่ถ้าคุณต้องการมีตัวเลขทศนิยมที่มีทศนิยมสองตำแหน่งแรกโดยไม่ปัดเศษคำตอบเหล่านั้นจะไม่ช่วย

ดังนั้นเพื่อให้ได้ตัวเลขทศนิยมที่มีทศนิยมสองตำแหน่งแรกฉันใช้เทคนิคนี้ ไม่ทำงานในบางกรณี

def float_of_2_decimal(float_n)
  float_n.round(3).to_s[0..3].to_f
end

ด้วย5.666666666666666666666666ก็จะกลับแทนโค้งมน5.66 5.67หวังว่ามันจะช่วยใครซักคน


1
มันใช้งานไม่ได้ เพื่อให้สามารถใช้งานได้คุณจะต้องคำนึงถึงหมายเลขทุกขนาด ใช้รูปแบบการใช้งานที่นี่คุณสามารถ: def float_of_2_decimal(float_n) num = float_n.to_s.split('.') num[1] = num[1][0..1] num.join(".").to_f end หรือง่ายกว่าที่คุณสามารถใช้float_n.to_d.round(2, :truncate).to_f
rorykoehler

สิ่งใดก็ตามที่มีค่ามากกว่า 9 ก่อนหน้าจุดทศนิยม
rorykoehler

ขอบคุณสำหรับจุด แต่วิธีการที่แนะนำของคุณล้มเหลวในจำนวนมากเช่นกัน!
Anwar

สำหรับการ11111111111111111.222222222222222ป้อนข้อมูลหนึ่งรายการแรก1.11และรายการที่สองแสดง1.11111111111111e+16
Anwar

1
ใช่คุณพูดถูก ... ครั้งหนึ่งเคยมี 16 แห่งที่อยู่ข้างหน้าหรือมากกว่า ปัญหาน้ำล้น ดีที่สุดติดทศนิยมใหญ่ถ้าทำงานกับตัวเลขขนาดใหญ่ Typecasting แนะนำปัญหา
rorykoehler

-5

ลองสิ่งนี้:

module Util
module MyUtil



    def self.redondear_up(suma,cantidad, decimales=0)

        unless suma.present?
            return nil
        end


        if suma>0
            resultado= (suma.to_f/cantidad)
            return resultado.round(decimales)
        end


        return nil


    end

end 
end 

3
ขอบคุณสำหรับคำตอบ. คุณช่วยแก้ไขให้เป็นภาษาอังกฤษได้ไหมเนื่องจากคำถามถูกถามเป็นภาษาอังกฤษ
Jared

Puedes traducir tu respuesta และinglés? Preguntas y respuestas en español deben existir aqui .
บุกรุก

-15

เพื่อตัดทศนิยมฉันใช้รหัสติดตาม:

<th><%#= sprintf("%0.01f",prom/total) %><!--1dec,aprox-->
    <% if prom == 0 or total == 0 %>
        N.E.
    <% else %>
        <%= Integer((prom/total).to_d*10)*0.1 %><!--1decimal,truncado-->
    <% end %>
        <%#= prom/total %>
</th>

หากคุณต้องการตัดให้เหลือ 2 ทศนิยมคุณควรใช้ Integr(a*100)*0.01


5
ไม่มีใครควรทำเช่นนี้เมื่อหล่อเปอร์เซ็นต์ นี่เป็นรูปแบบที่ไม่ดีจริงๆเพราะการตัดทอนคุณทำให้ความสามารถในการปัดเศษทศนิยมไปยังตำแหน่งทศนิยม 2 ตำแหน่งที่ใกล้ที่สุด เช่น 0.455 ถ้าคุณเพิ่งตัดทอนคุณจะได้ 0.45 ซึ่งผิดสำหรับการปัดเศษเพราะมันควรส่งผลให้ 0.46 ห้ามตัดทศนิยมเป็นจำนวนเสมอปัดเศษตัวเลขอื่นผลลัพธ์จะผิดเมื่อการปัดเศษขึ้นต้องเกิดขึ้น
The Gugaru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.