Python 3.x พฤติกรรมการปัดเศษ


176

ฉันเพิ่งอ่านใหม่มีอะไรใหม่ใน Python 3.0และระบุว่า:

กลยุทธ์การปัดเศษฟังก์ชัน round () และประเภทส่งคืนได้เปลี่ยนไป กรณีครึ่งทางที่แน่นอนจะถูกปัดเศษเป็นผลลัพธ์คู่ที่ใกล้เคียงที่สุดแทนที่จะอยู่ห่างจากศูนย์ (ตัวอย่างเช่น round (2.5) ส่งคืน 2 แทน 3)

และเอกสารสำหรับรอบ :

สำหรับประเภทในตัวที่สนับสนุนรอบ () ค่าจะถูกปัดเศษเป็นพหุคูณที่ใกล้เคียงที่สุดของ 10 ถึงกำลังไฟฟ้าลบ n; หากสองทวีคูณใกล้กันเท่ากันการปัดเศษจะไปทางเลือกคู่

ดังนั้นภายใต้v2.7.3 :

In [85]: round(2.5)
Out[85]: 3.0

In [86]: round(3.5)
Out[86]: 4.0

อย่างที่ฉันคาดไว้ อย่างไรก็ตามตอนนี้ภายใต้v3.2.3 :

In [32]: round(2.5)
Out[32]: 2

In [33]: round(3.5)
Out[33]: 4

ดูเหมือนว่าจะเป็นสิ่งที่ตรงกันข้ามกับสิ่งที่ฉันเข้าใจเกี่ยวกับการปัดเศษ ภาษาอังกฤษไม่ใช่ภาษาพื้นเมืองของฉัน แต่จนกว่าฉันจะอ่านสิ่งนี้ฉันคิดว่าฉันรู้ว่าการปัดเศษหมายถึง: - / ฉันแน่ใจว่าตอนที่ v3 ได้รับการแนะนำต้องมีการพูดคุยเกี่ยวกับเรื่องนี้ แต่ฉันไม่สามารถหาเหตุผลที่ดีได้ การค้นหาของฉัน

  1. ไม่มีใครเข้าใจว่าทำไมสิ่งนี้จึงเปลี่ยนเป็น
  2. มีภาษาการเขียนโปรแกรมหลักอื่น ๆ (เช่นC, C ++, Java, Perl, .. ) ที่ปัดเศษ (กับฉันไม่สอดคล้องกัน) หรือไม่?

ฉันหายไปนี่อะไร

อัปเดต: @ Li-aungYip ความคิดเห็นของอีกครั้ง "การปัดเศษของธนาคาร" ให้คำค้นหา / คำหลักที่ถูกต้องในการค้นหาและฉันพบคำถามดังกล่าว: ทำไม. NET ใช้การปัดเศษของธนาคารเป็นค่าเริ่มต้น ดังนั้นฉันจะอ่านอย่างระมัดระวัง


28
ฉันไม่มีเวลามองหาสิ่งนี้ แต่ฉันเชื่อว่าสิ่งนี้เรียกว่า "การปัดเศษของธนาคาร" ฉันเชื่อว่าเป็นเรื่องธรรมดาในอุตสาหกรรมการเงิน
Li-aung Yip

2
@sberry ดีใช่พฤติกรรมของมันสอดคล้องกับคำอธิบายของตัวเอง ดังนั้นถ้าจะพูดว่า "การปัดเศษ" เป็นสองเท่าค่าของมันและมันก็จะยังมีความสอดคล้อง :) .. แต่ดูเหมือนว่าสิ่งที่ตรงกันข้ามกับการปัดเศษทั่วไปหมายถึง ดังนั้นฉันกำลังมองหาความเข้าใจที่ดีขึ้น
Levon

1
@ Li-aungYip ขอบคุณที่รอคอยเรื่อง "การปัดเศษของ Banker" .. ฉันจะดูมัน
Levon

1
ที่เกี่ยวข้อง: stackoverflow.com/questions/10093783/…
Sven Marnach

3
ข้อควรทราบ: การปัดเศษของธนาคารนั้นไม่ใช่เรื่องธรรมดาในด้านการเงิน นี่คือวิธีที่ฉันได้รับการสอนให้เข้าเรียนในโรงเรียนประถมศึกษาในยุค 70 :-) แล้ว
Lennart Regebro

คำตอบ:


160

วิธีของ Python 3.0 ได้รับการพิจารณาว่าเป็นวิธีการปัดเศษแบบมาตรฐานในทุกวันนี้แม้ว่าการใช้งานภาษาบางอย่างยังไม่ได้อยู่บนรถบัส

เทคนิค "รอบ 0.5 เสมอเสมอ" ง่าย ๆ ทำให้มีอคติเล็กน้อยต่อจำนวนที่สูงขึ้น ด้วยการคำนวณจำนวนมากสิ่งนี้มีความสำคัญ วิธี Python 3.0 ช่วยกำจัดปัญหานี้

มีวิธีการปัดเศษมากกว่าหนึ่งวิธีในการใช้งานทั่วไป IEEE 754 ซึ่งเป็นมาตรฐานสากลสำหรับคณิตศาสตร์เลขทศนิยมกำหนดห้าวิธีการปัดเศษที่แตกต่างกัน (หนึ่งที่ใช้โดย Python 3.0 เป็นค่าเริ่มต้น) และมีคนอื่น ๆ

พฤติกรรมนี้ไม่เป็นที่รู้จักอย่างกว้างขวางเท่าที่ควร AppleScript คือถ้าฉันจำได้อย่างถูกต้องผู้ยอมรับต้นของวิธีการปัดเศษนี้ roundคำสั่งใน AppleScript จริงไม่เสนอหลายตัวเลือก แต่รอบที่มีต่อแม้จะเริ่มต้นเป็นอยู่ในมาตรฐาน IEEE 754 เห็นได้ชัดว่าวิศวกรผู้ดำเนินการroundคำสั่งเบื่อเพื่อให้ทันกับการร้องขอทั้งหมดที่จะ "ทำให้มันทำงานเหมือนที่ผมได้เรียนรู้ใน โรงเรียน "ที่เขาดำเนินการเพียงแค่นั้น: round 2.5 rounding as taught in schoolเป็นคำสั่ง AppleScript ที่ถูกต้อง :-)


4
ฉันไม่ทราบเกี่ยวกับ "วิธีการปัดเศษมาตรฐานเริ่มต้นในระดับสากลในทุกวันนี้" คุณจะ (หรือคนอื่น ๆ ) รู้หรือไม่ว่า C / C ++ / Java / Perl หรือภาษาอื่น ๆ "main-stream" ใช้การปัดเศษในลักษณะเดียวกันหรือไม่
Levon

3
รูบี้ทำมัน ภาษา. NET ของ Microsoft ทำได้ Java ไม่ปรากฏขึ้น ฉันไม่สามารถติดตามมันได้สำหรับทุกภาษาที่เป็นไปได้ แต่ฉันคิดว่ามันเป็นเรื่องธรรมดาที่สุดในภาษาที่เพิ่งได้รับการออกแบบมาพอสมควร ฉันคิดว่า C และ C ++ นั้นเก่าพอที่จะทำ
kindall

5
ruby ส่งกลับ3สำหรับ2.5.round
jfs

14
ฉันเพิ่มเล็กน้อยเกี่ยวกับการจัดการของ AppleScript นี้เพราะฉันชอบวิธีเหน็บแนมพฤติกรรมที่ "เก่า" ถูกนำไปใช้
kindall

2
@kindall วิธีนี้เป็นโหมดปัดเศษค่าเริ่มต้น IEEE ตั้งแต่ปี 1985 (เมื่อเผยแพร่ IEEE 754-1985) มันยังเป็นโหมดการปัดเศษเริ่มต้นใน C ตั้งแต่ C89 อย่างน้อย (และดังนั้นใน C ++) อย่างไรก็ตามตั้งแต่ C99 (และ C ++ 11 พร้อมการสนับสนุนเป็นระยะ ๆ ก่อนหน้านี้) ฟังก์ชั่น "round ()" มีอยู่ที่ใช้ ผูกรอบออกจากศูนย์แทน การลอยจุดลอยภายในและตระกูล rint () ของฟังก์ชั่นยังคงเชื่อฟังการตั้งค่าโหมดการปัดเศษ
Wlerin

41

คุณสามารถควบคุมการปัดเศษที่คุณได้รับใน Py3000 โดยใช้โมดูลทศนิยม :

>>> decimal.Decimal('3.5').quantize(decimal.Decimal('1'), 
    rounding=decimal.ROUND_HALF_UP)
>>> Decimal('4')

>>> decimal.Decimal('2.5').quantize(decimal.Decimal('1'),    
    rounding=decimal.ROUND_HALF_EVEN)
>>> Decimal('2')

>>> decimal.Decimal('3.5').quantize(decimal.Decimal('1'), 
    rounding=decimal.ROUND_HALF_DOWN)
>>> Decimal('3')

ขอบคุณ .. ฉันไม่คุ้นเคยกับโมดูลนี้ ความคิดใดที่ฉันจะได้รับพฤติกรรมของ Python v 2.x ตัวอย่างที่คุณแสดงดูเหมือนจะไม่ทำอย่างนั้น แค่อยากรู้ว่ามันจะเป็นไปได้ไหม
Levon

1
@ ระดับ: ค่าคงROUND_HALF_UPที่เหมือนกับพฤติกรรมเดิมของ Python 2.X
dawg

2
คุณยังสามารถตั้งค่าบริบทสำหรับโมดูลทศนิยมที่ทำสิ่งนี้ให้คุณโดยปริยาย ดูsetcontext()ฟังก์ชั่น
kindall

นี่คือสิ่งที่ฉันกำลังมองหาในวันนี้ ทำงานได้ตามที่คาดหวังใน Python 3.4.3 นอกจากนี้ยังมีข้อสังเกตว่าคุณสามารถควบคุมว่าจะปัดเศษเป็นจำนวนเท่าใดโดยเปลี่ยนquantize(decimal.Decimal('1')เป็นquantize(decimal.Decimal('0.00')ถ้าคุณต้องการปัดเศษให้เป็น 100s ใกล้เคียงที่สุดเช่นหาเงิน
อิกอร์

วิธีนี้ทำงานแทนสำหรับround(number, ndigits)ตราบเท่าที่ndigitsเป็นบวก round(5, -1)แต่รำคาญคุณไม่สามารถใช้มันเพื่อแทนที่สิ่งที่ต้องการ
Pekka Klärck

15

เพียงเพิ่มที่นี่บันทึกสำคัญจากเอกสาร:

https://docs.python.org/dev/library/functions.html#round

บันทึก

พฤติกรรมของ round () สำหรับ floats นั้นน่าประหลาดใจตัวอย่างเช่น round (2.675, 2) ให้ 2.67 แทนที่จะเป็น 2.68 ที่คาดไว้ นี่ไม่ใช่ข้อผิดพลาด: เป็นผลมาจากความจริงที่ว่าเศษส่วนทศนิยมส่วนใหญ่ไม่สามารถแสดงได้ว่าเป็นทศนิยม ดูคณิตศาสตร์เลขทศนิยม: ประเด็นและข้อ จำกัด สำหรับข้อมูลเพิ่มเติม

ดังนั้นอย่าแปลกใจที่ได้ผลลัพธ์ต่อไปนี้ใน Python 3.2:

>>> round(0.25,1), round(0.35,1), round(0.45,1), round(0.55,1)
(0.2, 0.3, 0.5, 0.6)

>>> round(0.025,2), round(0.035,2), round(0.045,2), round(0.055,2)
(0.03, 0.04, 0.04, 0.06)

ผมเห็นว่า. และปฏิกิริยาแรกของฉัน: ใครใช้ซีพียู 16 บิตที่ไม่สามารถแสดงการเรียงสับเปลี่ยนทั้งหมดของ "2.67x" การบอกว่าเศษส่วนไม่สามารถแสดงในรูปลอยได้ดูเหมือนว่าแพะรับบาปที่นี่: ไม่มีซีพียูสมัยใหม่ที่ไม่ถูกต้องในรูปแบบใดก็ได้ (ยกเว้น Python?)
Adam

9
@ อดัม: ฉันคิดว่าคุณเข้าใจผิด รูปแบบไบนารี (IEEE 754 binary64) ที่ใช้ในการจัดเก็บลอยไม่สามารถเป็นตัวแทน2.675ตรง: 2.67499999999999982236431605997495353221893310546875ที่ใกล้เคียงที่สุดคอมพิวเตอร์สามารถได้รับคือ ที่สวยใกล้ชิด แต่ก็ไม่ได้ว่าเท่ากับ2.675: มันเล็กน้อยใกล้ชิดกับกว่า2.67 2.68ดังนั้นroundการทำงานจะเป็นสิ่งที่ถูกต้องและรอบมันไปใกล้ชิดมูลค่า 2 2.67หลักหลังจุดคือ นี่ไม่เกี่ยวอะไรกับ Python และทุกสิ่งที่เกี่ยวข้องกับ binary floating-point
Mark Dickinson

3
ไม่ใช่ "สิ่งที่ถูกต้อง" เพราะได้รับค่าคงที่ซอร์สโค้ด :) แต่ฉันเห็นประเด็นของคุณ
อดัม

@ อดัม: ฉันวิ่งเข้าไปในการเล่นโวหารเดียวกันนี้ใน JS ก่อนดังนั้นจึงไม่ใช่ภาษาที่เฉพาะเจาะจง
อิกอร์

5

ฉันเพิ่งมีปัญหากับสิ่งนี้เช่นกัน ดังนั้นฉันได้พัฒนาโมดูล python 3 ที่มี 2 ฟังก์ชั่น trueround () และ trueround_precision () ที่พูดถึงเรื่องนี้และให้พฤติกรรมการปัดเศษเดียวกันถูกนำมาใช้จากโรงเรียนประถม (ไม่ใช่การปัดเศษของธนาคาร) นี่คือโมดูล เพียงบันทึกรหัสและคัดลอกหรือนำเข้า หมายเหตุ: โมดูล trueround_precision สามารถเปลี่ยนพฤติกรรมการปัดเศษขึ้นอยู่กับความต้องการตามแฟล็ก ROUND_CEILING, ROUND_DOWN, โมดูล ROUND_FLOOR, ROUND_HALF_DOWN, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_UP และ ROUND_05UP สำหรับฟังก์ชั่นด้านล่างโปรดดูเอกสารประกอบหรือใช้ความช่วยเหลือ (trueround) และช่วยเหลือ (trueround_precision) หากคัดลอกไปที่ล่ามเพื่อรับเอกสารเพิ่มเติม

#! /usr/bin/env python3
# -*- coding: utf-8 -*-

def trueround(number, places=0):
    '''
    trueround(number, places)

    example:

        >>> trueround(2.55, 1) == 2.6
        True

    uses standard functions with no import to give "normal" behavior to 
    rounding so that trueround(2.5) == 3, trueround(3.5) == 4, 
    trueround(4.5) == 5, etc. Use with caution, however. This still has 
    the same problem with floating point math. The return object will 
    be type int if places=0 or a float if places=>1.

    number is the floating point number needed rounding

    places is the number of decimal places to round to with '0' as the
        default which will actually return our interger. Otherwise, a
        floating point will be returned to the given decimal place.

    Note:   Use trueround_precision() if true precision with
            floats is needed

    GPL 2.0
    copywrite by Narnie Harshoe <signupnarnie@gmail.com>
    '''
    place = 10**(places)
    rounded = (int(number*place + 0.5if number>=0 else -0.5))/place
    if rounded == int(rounded):
        rounded = int(rounded)
    return rounded

def trueround_precision(number, places=0, rounding=None):
    '''
    trueround_precision(number, places, rounding=ROUND_HALF_UP)

    Uses true precision for floating numbers using the 'decimal' module in
    python and assumes the module has already been imported before calling
    this function. The return object is of type Decimal.

    All rounding options are available from the decimal module including 
    ROUND_CEILING, ROUND_DOWN, ROUND_FLOOR, ROUND_HALF_DOWN, ROUND_HALF_EVEN, 
    ROUND_HALF_UP, ROUND_UP, and ROUND_05UP.

    examples:

        >>> trueround(2.5, 0) == Decimal('3')
        True
        >>> trueround(2.5, 0, ROUND_DOWN) == Decimal('2')
        True

    number is a floating point number or a string type containing a number on 
        on which to be acted.

    places is the number of decimal places to round to with '0' as the default.

    Note:   if type float is passed as the first argument to the function, it
            will first be converted to a str type for correct rounding.

    GPL 2.0
    copywrite by Narnie Harshoe <signupnarnie@gmail.com>
    '''
    from decimal import Decimal as dec
    from decimal import ROUND_HALF_UP
    from decimal import ROUND_CEILING
    from decimal import ROUND_DOWN
    from decimal import ROUND_FLOOR
    from decimal import ROUND_HALF_DOWN
    from decimal import ROUND_HALF_EVEN
    from decimal import ROUND_UP
    from decimal import ROUND_05UP

    if type(number) == type(float()):
        number = str(number)
    if rounding == None:
        rounding = ROUND_HALF_UP
    place = '1.'
    for i in range(places):
        place = ''.join([place, '0'])
    return dec(number).quantize(dec(place), rounding=rounding)

หวังว่าจะช่วยได้

Narnie


5

Python 3.x ปัดเศษค่า. 5 เป็นเพื่อนบ้านซึ่งเท่ากัน

assert round(0.5) == 0
assert round(1.5) == 2
assert round(2.5) == 2

import decimal

assert decimal.Decimal('0.5').to_integral_value() == 0
assert decimal.Decimal('1.5').to_integral_value() == 2
assert decimal.Decimal('2.5').to_integral_value() == 2

อย่างไรก็ตามหนึ่งสามารถเปลี่ยนการปัดเศษทศนิยม "กลับ" เพื่อเสมอ 0.5 ขึ้นไปหากจำเป็น:

decimal.getcontext().rounding = decimal.ROUND_HALF_UP

assert decimal.Decimal('0.5').to_integral_value() == 1
assert decimal.Decimal('1.5').to_integral_value() == 2
assert decimal.Decimal('2.5').to_integral_value() == 3

i = int(decimal.Decimal('2.5').to_integral_value()) # to get an int
assert i == 3
assert type(i) is int

1

Python 2 พฤติกรรมการปัดเศษใน python 3

การเพิ่ม 1 ที่ตำแหน่งทศนิยม 15 ความแม่นยำสูงสุด 15 หลัก

round2=lambda x,y=None: round(x+1e-15,y)

3
คุณสามารถอธิบายสัญชาตญาณที่อยู่เบื้องหลังสูตรนี้ได้ไหม
Hadi

2
จากสิ่งที่ฉันเข้าใจเศษส่วนที่ไม่สามารถแสดงได้อย่างถูกต้องจะมีมากถึง 15 9 จากนั้นไม่แน่ชัด ยกตัวอย่างเช่นเป็น2.675 2.67499999999999982236431605997495353221893310546875การเพิ่ม 1e-15 จะทำให้หงายท้องมากกว่า 2.675 และทำให้กลมถูกต้อง ถ้าเศษส่วนมีค่าคงที่ของรหัสอยู่แล้วการเพิ่ม 1e-15 จะไม่เปลี่ยนการปัดเศษ
Benoit Dufresne

1

บางกรณี:

in: Decimal(75.29 / 2).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
in: round(75.29 / 2, 2)
out: 37.65 GOOD

in: Decimal(85.55 / 2).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
in: round(85.55 / 2, 2)
out: 42.77 BAD

สำหรับการแก้ไข:

in: round(75.29 / 2 + 0.00001, 2)
out: 37.65 GOOD
in: round(85.55 / 2 + 0.00001, 2)
out: 42.78 GOOD

ถ้าคุณต้องการทศนิยมมากขึ้นตัวอย่างเช่น 4 คุณควรเพิ่ม (+ 0.0000001)

ทำงานให้ฉัน


นี่เป็นทางออกเดียวที่ใช้ได้สำหรับฉันขอบคุณสำหรับการโพสต์ ดูเหมือนว่าทุกคนมีความตั้งใจในการปัดเศษขึ้น / ลง 0.5 ดังนั้นฉันจึงไม่สามารถจัดการกับปัญหาการปัดเศษทศนิยมหลายตำแหน่ง
Gayathri

-1

ตัวอย่างการสืบพันธุ์:

['{} => {}'.format(x+0.5, round(x+0.5)) for x in range(10)]

['0.5 => 0', '1.5 => 2', '2.5 => 2', '3.5 => 4', '4.5 => 4', '5.5 => 6', '6.5 => 6', '7.5 => 8', '8.5 => 8', '9.5 => 10']

API: https://docs.python.org/3/library/functions.html#round

สหรัฐอเมริกา:

ส่งคืนจำนวนที่ปัดเศษเพื่อความแม่นยำของ ndigits หลังจากจุดทศนิยม หากไม่ระบุ ndigits หรือเป็น None จะส่งคืนจำนวนเต็มที่ใกล้ที่สุดไปยังอินพุต

สำหรับประเภทในตัวรองรับรอบ () ค่าจะถูกปัดเศษเป็นพหุคูณที่ใกล้เคียงที่สุดของ 10 ถึงกำลังลบด้วย ndigits ถ้าสองทวีคูณเท่ากันจะทำการปัดเศษไปยังตัวเลือกคู่ (ดังนั้นเช่นทั้งรอบ (0.5) และรอบ (-0.5) คือ 0 และรอบ (1.5) คือ 2) ค่าจำนวนเต็มใด ๆ ที่ถูกต้องสำหรับ ndigits (ค่าบวกศูนย์หรือค่าลบ) ค่าส่งคืนเป็นจำนวนเต็มถ้าละเว้น ndigits หรือไม่มี มิฉะนั้นค่าส่งคืนจะเป็นชนิดเดียวกับตัวเลข

สำหรับหมายเลขออบเจ็กต์ Python ทั่วไปให้ปัดเศษเป็นจำนวน รอบ

หมายเหตุพฤติกรรมของ round () สำหรับ floats นั้นน่าประหลาดใจตัวอย่างเช่น round (2.675, 2) ให้ 2.67 แทนที่จะเป็น 2.68 ที่คาดไว้ นี่ไม่ใช่ข้อผิดพลาด: เป็นผลมาจากความจริงที่ว่าเศษส่วนทศนิยมส่วนใหญ่ไม่สามารถแสดงได้ว่าเป็นทศนิยม ดูคณิตศาสตร์เลขทศนิยม: ประเด็นและข้อ จำกัด สำหรับข้อมูลเพิ่มเติม

จากข้อมูลเชิงลึกนี้คุณสามารถใช้คณิตศาสตร์เพื่อแก้ปัญหาได้

import math
def my_round(i):
  f = math.floor(i)
  return f if i - f < 0.5 else f+1

ตอนนี้คุณสามารถรันการทดสอบเดียวกันกับ my_round แทนการปัดเศษ

['{} => {}'.format(x + 0.5, my_round(x+0.5)) for x in range(10)]
['0.5 => 1', '1.5 => 2', '2.5 => 3', '3.5 => 4', '4.5 => 5', '5.5 => 6', '6.5 => 7', '7.5 => 8', '8.5 => 9', '9.5 => 10']

-2

วิธีที่ง่ายที่สุดในการปัดเศษใน Python 3.x ตามที่สอนในโรงเรียนคือการใช้ตัวแปรเสริม:

n = 0.1 
round(2.5 + n)

และสิ่งเหล่านี้จะเป็นผลลัพธ์ของซีรีส์ 2.0 ถึง 3.0 (ในขั้นตอน 0.1):

>>> round(2 + n)
>>> 2

>>> round(2.1 + n)
>>> 2

>>> round(2.2 + n)
>>> 2

>>> round(2.3 + n)
>>> 2

>>> round(2.4 + n)
>>> 2

>>> round(2.5 + n)
>>> 3

>>> round(2.6 + n)
>>> 3

>>> round(2.7 + n)
>>> 3

>>> round(2.8 + n)
>>> 3

>>> round(2.9 + n)
>>> 3

>>> round(3 + n)
>>> 3

-2

คุณสามารถควบคุมการปัดเศษโดยใช้โมดูล math.ceil:

import math
print(math.ceil(2.5))
> 3

นั่นจะส่งคืนตัวเลขโดยไม่มีส่วนทศนิยมซึ่งจะไม่ปัดเศษ ceil (2.5) = 2, ceil (2.99) = 2
krafter

1
ใน python3 +, ถ้าอาร์กิวเมนต์ number เป็นจำนวนบวกหรือลบฟังก์ชัน ceil จะส่งคืนค่าเพดาน
Eds_k

ใน [14]: math.ceil (2.99) Out [14]: 3
Eds_k

ใช่ฉันขอโทษฉันผิด Ceil () ส่งคืนค่าเพดานในขณะที่ floor () ส่งคืนค่าที่ฉันกำลังพูดถึง แต่ถึงกระนั้นในความคิดของฉันนี้ไม่ได้เป็นพฤติกรรมการปัดเศษ (ฟังก์ชั่นทั้งสอง)
krafter

-4

ลองรหัสนี้:

def roundup(input):   
   demo = input  if str(input)[-1] != "5" else str(input).replace("5","6")
   place = len(demo.split(".")[1])-1
   return(round(float(demo),place))

ผลลัพธ์จะเป็น:

>>> x = roundup(2.5)
>>> x
3.0  
>>> x = roundup(2.05)
>>> x
2.1 
>>> x = roundup(2.005)
>>> x
2.01 

Ooutput คุณสามารถตรวจสอบได้ที่นี่: https://i.stack.imgur.com/QQUkS.png

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