Hướng dẫn how to round(2.5 to 3 in python) - làm thế nào để làm tròn (2,5 đến 3 trong python)

Gần đây tôi cũng có vấn đề với điều này. Do đó, tôi đã phát triển một mô -đun Python 3 có 2 chức năng Trueround [] và Trueround_precision [] giải quyết vấn đề này và đưa ra hành vi làm tròn tương tự được sử dụng từ trường tiểu học [không phải là làm tròn của ngân hàng]. Đây là mô -đun. Chỉ cần lưu mã và sao chép nó vào hoặc nhập nó. Lưu ý: Mô -đun Trueround_Precision có thể thay đổi hành vi làm tròn tùy thuộc vào nhu cầu theo Round_ceiling, Round_down, Round_Floor, Round_half_down, Round_half_Even, Round_half_up, Round_up và Round_05Up Flags trong mô -đun thập phân Đối với các chức năng dưới đây, hãy xem Docstrings hoặc sử dụng trợ giúp [Trueround] và Trợ giúp [Trueround_Precision] nếu được sao chép vào một thông dịch viên để biết thêm tài liệu.

#! /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 
    '''
    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 
    '''
    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]

Hi vọng điêu nay co ich,

Narnie

Đó là kỷ nguyên của dữ liệu lớn và mỗi ngày ngày càng có nhiều doanh nghiệp cố gắng tận dụng dữ liệu của họ để đưa ra quyết định sáng suốt. Nhiều doanh nghiệp đang chuyển sang hệ sinh thái khoa học dữ liệu mạnh mẽ của Python, để phân tích dữ liệu của họ, bằng chứng là sự phổ biến ngày càng tăng của Python trong lĩnh vực khoa học dữ liệu.

Một điều mà mọi người thực hành khoa học dữ liệu phải ghi nhớ là làm thế nào một bộ dữ liệu có thể bị sai lệch. Rút ra kết luận từ dữ liệu thiên vị có thể dẫn đến những sai lầm tốn kém.

Có nhiều cách thiên vị có thể leo vào một bộ dữ liệu. Nếu bạn đã nghiên cứu một số số liệu thống kê, bạn có thể quen thuộc với các thuật ngữ như báo cáo sai lệch, sai lệch lựa chọn và thiên vị lấy mẫu. Có một loại thiên vị khác đóng vai trò quan trọng khi bạn đang xử lý dữ liệu số: Xu hướng làm tròn.

Trong bài viết này, bạn sẽ học:

  • Tại sao cách bạn số tròn lại quan trọng
  • Cách làm tròn một số theo các chiến lược làm tròn khác nhau và cách thực hiện từng phương pháp trong Python thuần túy
  • Làm thế nào làm tròn ảnh hưởng đến dữ liệu và chiến lược làm tròn nào giảm thiểu hiệu ứng này
  • Cách làm tròn các số trong các mảng numpy và gấu trúc DataFrames
  • Khi nào nên áp dụng các chiến lược làm tròn khác nhau

Bài viết này không phải là một chuyên luận về độ chính xác số trong điện toán, mặc dù chúng tôi sẽ liên lạc ngắn gọn về chủ đề này. Chỉ có sự quen thuộc với các nguyên tắc cơ bản của Python là cần thiết, và toán học liên quan ở đây sẽ cảm thấy thoải mái cho bất kỳ ai quen thuộc với tương đương với đại số trung học.

Hãy bắt đầu bằng cách nhìn vào cơ chế làm tròn tích hợp Python.

Chức năng
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 tích hợp của Python

Python có chức năng

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 tích hợp có hai đối số số,
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 và
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
7 và trả về số
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 được làm tròn thành
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
7. Đối số
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
7 mặc định là 0, do đó, để lại kết quả trong một số được làm tròn cho một số nguyên. Như bạn thấy,
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 có thể không hoạt động như bạn mong đợi.

Cách mà hầu hết mọi người được dạy để làm tròn một số đi một cái gì đó như thế này:

Làm tròn số

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 đến
>>> truncate[125.6, -1]
120.0

>>> truncate[-1374.25, -3]
-1000.0
3 vị trí thập phân bằng cách lần đầu tiên chuyển điểm thập phân trong
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 với
>>> truncate[125.6, -1]
120.0

>>> truncate[-1374.25, -3]
-1000.0
3 vị trí bằng cách nhân
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 với 10ᵖ [10 được nâng lên công suất
>>> truncate[125.6, -1]
120.0

>>> truncate[-1374.25, -3]
-1000.0
3] để có được số mới
>>> truncate[125.6, -1]
120.0

>>> truncate[-1374.25, -3]
-1000.0
8.

Sau đó nhìn vào chữ số

>>> truncate[125.6, -1]
120.0

>>> truncate[-1374.25, -3]
-1000.0
9 ở vị trí thập phân đầu tiên của
>>> truncate[125.6, -1]
120.0

>>> truncate[-1374.25, -3]
-1000.0
8. Nếu
>>> truncate[125.6, -1]
120.0

>>> truncate[-1374.25, -3]
-1000.0
9 nhỏ hơn 5, vòng
>>> truncate[125.6, -1]
120.0

>>> truncate[-1374.25, -3]
-1000.0
8 xuống số nguyên gần nhất. Nếu không, vòng
>>> truncate[125.6, -1]
120.0

>>> truncate[-1374.25, -3]
-1000.0
8 lên.

Cuối cùng, thay đổi điểm thập phân trở lại

>>> truncate[125.6, -1]
120.0

>>> truncate[-1374.25, -3]
-1000.0
3 vị trí bằng cách chia
>>> truncate[125.6, -1]
120.0

>>> truncate[-1374.25, -3]
-1000.0
8 cho 10ᵖ.

Nó là một thuật toán đơn giản! Ví dụ: số

>>> import math

>>> math.ceil[1.2]
2

>>> math.ceil[2]
2

>>> math.ceil[-0.5]
0
6 được làm tròn đến số toàn bộ gần nhất là
>>> import math

>>> math.ceil[1.2]
2

>>> math.ceil[2]
2

>>> math.ceil[-0.5]
0
7. Số
>>> import math

>>> math.ceil[1.2]
2

>>> math.ceil[2]
2

>>> math.ceil[-0.5]
0
8 được làm tròn đến một vị trí thập phân là
>>> import math

>>> math.ceil[1.2]
2

>>> math.ceil[2]
2

>>> math.ceil[-0.5]
0
9.

Bây giờ hãy mở một phiên phiên dịch và vòng

>>> import math

>>> math.ceil[1.2]
2

>>> math.ceil[2]
2

>>> math.ceil[-0.5]
0
6 đến số toàn bộ gần nhất bằng cách sử dụng chức năng
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 tích hợp của Python,: Chức năng:

Gasp!

Làm thế nào để

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 xử lý số
def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier
3?

Vì vậy,

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 vòng
def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier
3 lên đến
def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier
6 và
>>> import math

>>> math.ceil[1.2]
2

>>> math.ceil[2]
2

>>> math.ceil[-0.5]
0
6 xuống
def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier
6!

Trước khi bạn đưa ra một vấn đề trên trình theo dõi lỗi Python, hãy để tôi đảm bảo với bạn rằng

def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier
9 được cho là sẽ trả về
def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier
6. Có một lý do chính đáng tại sao
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 hành xử theo cách nó làm.

Trong bài viết này, bạn sẽ học được rằng có nhiều cách để làm tròn một con số hơn bạn có thể mong đợi, mỗi cách có những ưu điểm và nhược điểm độc đáo.

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 hành xử theo một chiến lược làm tròn cụ thể mà có thể hoặc không phải là một trong những tình huống bạn cần cho một tình huống nhất định.

Bạn có thể tự hỏi, có thể cách mà tôi có thể có những con số thực sự có nhiều tác động? Hãy cùng xem xét về việc các tác động của làm tròn có thể đến mức nào.

Bao nhiêu tác động có thể làm tròn có?

Giả sử bạn có một ngày vô cùng may mắn và tìm thấy 100 đô la trên mặt đất. Thay vì chi tiêu tất cả tiền của bạn cùng một lúc, bạn quyết định chơi thông minh và đầu tư tiền của bạn bằng cách mua một số cổ phiếu của các cổ phiếu khác nhau.

Giá trị của một cổ phiếu phụ thuộc vào cung và cầu. Càng nhiều người muốn mua một cổ phiếu, càng có nhiều giá trị mà cổ phiếu có và ngược lại. Trong thị trường chứng khoán khối lượng lớn, giá trị của một cổ phiếu cụ thể có thể dao động trên cơ sở thứ hai.

Hãy để chạy một thí nghiệm nhỏ. Chúng tôi sẽ giả vờ giá trị tổng thể của các cổ phiếu bạn đã mua dao động theo một số ngẫu nhiên nhỏ mỗi giây, giả sử từ 0,05 đến -0,05 đô la. Biến động này có thể không nhất thiết là một giá trị tốt đẹp chỉ với hai vị trí thập phân. Ví dụ: giá trị tổng thể có thể tăng thêm 0,031286 một giây và giảm giây tiếp theo bằng 0,028476.

Bạn không muốn theo dõi giá trị của mình đến vị trí thập phân thứ năm hoặc thứ sáu, vì vậy bạn quyết định cắt giảm mọi thứ sau vị trí thập phân thứ ba. Trong biệt ngữ làm tròn, điều này được gọi là cắt số đến vị trí thập phân thứ ba. Có một số lỗi được mong đợi ở đây, nhưng bằng cách giữ ba vị trí thập phân, lỗi này không thể là đáng kể. Đúng?truncating the number to the third decimal place. There’s some error to be expected here, but by keeping three decimal places, this error couldn’t be substantial. Right?

Để chạy thử nghiệm của chúng tôi bằng Python, hãy để bắt đầu bằng cách viết hàm

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03 cắt ngắn một số xuống còn ba số thập phân:

>>>

>>> def truncate[n]:
...     return int[n * 1000] / 1000

Hàm

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03 hoạt động bằng cách đầu tiên chuyển điểm thập phân trong số
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 ba vị trí bên phải bằng cách nhân
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 với
>>> def truncate[n]:
...     return int[n * 1000] / 1000
07. Phần số nguyên của số mới này được thực hiện với
>>> def truncate[n]:
...     return int[n * 1000] / 1000
08. Cuối cùng, điểm thập phân được thay đổi ba vị trí sang trái bằng cách chia
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 cho
>>> def truncate[n]:
...     return int[n * 1000] / 1000
07.

Tiếp theo, hãy để xác định các tham số ban đầu của mô phỏng. Bạn sẽ cần hai biến: một để theo dõi giá trị thực tế của cổ phiếu của bạn sau khi mô phỏng hoàn tất và một biến cho giá trị của cổ phiếu của bạn sau khi bạn đã cắt giảm ba vị trí thập phân ở mỗi bước.

Bắt đầu bằng cách khởi tạo các biến này thành

>>> def truncate[n]:
...     return int[n * 1000] / 1000
11:

>>>

>>> actual_value, truncated_value = 100, 100

Hàm

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03 hoạt động bằng cách đầu tiên chuyển điểm thập phân trong số
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 ba vị trí bên phải bằng cách nhân
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 với
>>> def truncate[n]:
...     return int[n * 1000] / 1000
07. Phần số nguyên của số mới này được thực hiện với
>>> def truncate[n]:
...     return int[n * 1000] / 1000
08. Cuối cùng, điểm thập phân được thay đổi ba vị trí sang trái bằng cách chia
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 cho
>>> def truncate[n]:
...     return int[n * 1000] / 1000
07.

>>>

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239

Hàm

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03 hoạt động bằng cách đầu tiên chuyển điểm thập phân trong số
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 ba vị trí bên phải bằng cách nhân
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 với
>>> def truncate[n]:
...     return int[n * 1000] / 1000
07. Phần số nguyên của số mới này được thực hiện với
>>> def truncate[n]:
...     return int[n * 1000] / 1000
08. Cuối cùng, điểm thập phân được thay đổi ba vị trí sang trái bằng cách chia
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 cho
>>> def truncate[n]:
...     return int[n * 1000] / 1000
07.

Tiếp theo, hãy để xác định các tham số ban đầu của mô phỏng. Bạn sẽ cần hai biến: một để theo dõi giá trị thực tế của cổ phiếu của bạn sau khi mô phỏng hoàn tất và một biến cho giá trị của cổ phiếu của bạn sau khi bạn đã cắt giảm ba vị trí thập phân ở mỗi bước.

Bắt đầu bằng cách khởi tạo các biến này thành

>>> def truncate[n]:
...     return int[n * 1000] / 1000
11:

Bỏ qua thời điểm mà

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 không hành xử như bạn mong đợi, hãy để Lôi thử chạy lại mô phỏng. Chúng tôi sẽ sử dụng
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 lần này để làm tròn đến ba vị trí thập phân ở mỗi bước và
>>> def truncate[n]:
...     return int[n * 1000] / 1000
37 Mô phỏng một lần nữa để có được kết quả tương tự như trước đây:

>>>

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258

Thật la khac biệt!

Có vẻ như gây sốc, lỗi chính xác này đã gây ra sự khuấy động vào đầu những năm 1980 khi hệ thống được thiết kế để ghi lại giá trị của Sở giao dịch chứng khoán Vancouver đã cắt giảm giá trị chỉ số tổng thể thành ba vị trí thập phân thay vì làm tròn. Lỗi làm tròn đã gây ảnh hưởng đến các cuộc bầu cử và thậm chí dẫn đến việc mất mạng.

Làm thế nào bạn có số tròn là quan trọng, và là một nhà phát triển và thiết kế phần mềm có trách nhiệm, bạn cần biết những vấn đề phổ biến là gì và làm thế nào để đối phó với chúng. Hãy để lặn và điều tra các phương pháp làm tròn khác nhau là gì và làm thế nào bạn có thể thực hiện từng phương pháp trong Python thuần túy.

Một người đàn ông của các phương pháp

Có rất nhiều chiến lược làm tròn, mỗi chiến lược đều có ưu điểm và nhược điểm. Trong phần này, bạn sẽ tìm hiểu về một số kỹ thuật phổ biến nhất và cách chúng có thể ảnh hưởng đến dữ liệu của bạn.

Cắt ngắn

Phương pháp đơn giản nhất, mặc dù nhất định, để làm tròn một số là cắt số số thành một số chữ số nhất định. Khi bạn cắt một số, bạn thay thế từng chữ số sau một vị trí nhất định bằng 0. Dưới đây là một số ví dụ:

Giá trịCắt ngắn đểKết quả
12.345 Hàng chục nơi10
12.345 Những người12
12.345 Vị trí thứ mười12.3
12.345 Vị trí hàng trăm12.34

Bạn đã thấy một cách để thực hiện điều này trong hàm

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03 từ mức độ ảnh hưởng của việc làm tròn? tiết diện. Trong chức năng đó, số đầu vào đã bị cắt giảm thành ba số thập phân bởi:

  • Nhân số lượng với
    >>> def truncate[n]:
    ...     return int[n * 1000] / 1000
    
    07 để chuyển số thập phân ba vị trí sang bên phải
  • Lấy phần số nguyên của số mới đó với
    >>> def truncate[n]:
    ...     return int[n * 1000] / 1000
    
    08
  • Chuyển vị trí thập phân ba vị trí trở lại bên trái bằng cách chia cho
    >>> def truncate[n]:
    ...     return int[n * 1000] / 1000
    
    07

Bạn có thể khái quát quy trình này bằng cách thay thế

>>> def truncate[n]:
...     return int[n * 1000] / 1000
07 bằng số 10ᵖ [
>>> def truncate[n]:
...     return int[n * 1000] / 1000
43 được nâng lên công suất PTH], trong đó p là số lượng vị trí thập phân để cắt ngắn đến:

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier

Trong phiên bản này của

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03, đối số thứ hai mặc định là
>>> def truncate[n]:
...     return int[n * 1000] / 1000
20 để nếu không có đối số thứ hai được chuyển đến hàm, thì
>>> def truncate[n]:
...     return int[n * 1000] / 1000
03 sẽ trả về phần số nguyên của bất kỳ số nào được truyền cho nó.

Hàm

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03 hoạt động tốt cho cả số dương và số âm:

>>>

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62

Bạn thậm chí có thể chuyển một số âm cho

>>> def truncate[n]:
...     return int[n * 1000] / 1000
48 để cắt ngắn thành các chữ số ở bên trái của dấu thập phân:

>>>

>>> truncate[125.6, -1]
120.0

>>> truncate[-1374.25, -3]
-1000.0

Khi bạn cắt ngắn một số dương, bạn đang làm tròn nó xuống. Tương tự như vậy, cắt ngắn một số âm tròn số đó lên. Theo một nghĩa nào đó, cắt ngắn là sự kết hợp của các phương pháp làm tròn tùy thuộc vào dấu hiệu của số bạn đang làm tròn.

Hãy cùng xem từng phương pháp làm tròn này một cách riêng lẻ, bắt đầu bằng cách làm tròn.

Tập trung

Chiến lược làm tròn thứ hai mà chúng tôi sẽ xem xét được gọi là làm tròn. Chiến lược này luôn làm tròn một số lên đến một số chữ số cụ thể. Bảng sau đây tóm tắt chiến lược này:

Giá trịCắt ngắn đểKết quả
12.345 Hàng chục nơi20
12.345 Những người13
12.345 Vị trí thứ mười12.4
12.345 Vị trí hàng trăm12.35

Bạn đã thấy một cách để thực hiện điều này trong hàm

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03 từ mức độ ảnh hưởng của việc làm tròn? tiết diện. Trong chức năng đó, số đầu vào đã bị cắt giảm thành ba số thập phân bởi:

Nhân số lượng với

>>> def truncate[n]:
...     return int[n * 1000] / 1000
07 để chuyển số thập phân ba vị trí sang bên phải

Lấy phần số nguyên của số mới đó với

>>> def truncate[n]:
...     return int[n * 1000] / 1000
08

Chuyển vị trí thập phân ba vị trí trở lại bên trái bằng cách chia cho

>>> def truncate[n]:
...     return int[n * 1000] / 1000
07ceiling function maps every number to its ceiling. To allow the ceiling function to accept integers, the ceiling of an integer is defined to be the integer itself. So the ceiling of the number
def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier
6 is
def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier
6.

Bạn có thể khái quát quy trình này bằng cách thay thế

>>> def truncate[n]:
...     return int[n * 1000] / 1000
07 bằng số 10ᵖ [
>>> def truncate[n]:
...     return int[n * 1000] / 1000
43 được nâng lên công suất PTH], trong đó p là số lượng vị trí thập phân để cắt ngắn đến:

>>>

>>> import math

>>> math.ceil[1.2]
2

>>> math.ceil[2]
2

>>> math.ceil[-0.5]
0

Trong phiên bản này của

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03, đối số thứ hai mặc định là
>>> def truncate[n]:
...     return int[n * 1000] / 1000
20 để nếu không có đối số thứ hai được chuyển đến hàm, thì
>>> def truncate[n]:
...     return int[n * 1000] / 1000
03 sẽ trả về phần số nguyên của bất kỳ số nào được truyền cho nó.

Hàm

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03 hoạt động tốt cho cả số dương và số âm:

def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier

Bạn thậm chí có thể chuyển một số âm cho

>>> def truncate[n]:
...     return int[n * 1000] / 1000
48 để cắt ngắn thành các chữ số ở bên trái của dấu thập phân:

Mô hình này thay đổi điểm thập phân, áp dụng một số phương pháp làm tròn để làm tròn sang số nguyên, và sau đó chuyển điểm thập phân trở lại sẽ đi lại nhiều lần khi chúng tôi điều tra các phương pháp làm tròn nhiều hơn. Rốt cuộc, đây là thuật toán tinh thần mà con người chúng ta sử dụng cho các số tròn bằng tay.

Hãy cùng xem xét

>>> def truncate[n]:
...     return int[n * 1000] / 1000
68 hoạt động tốt như thế nào cho các đầu vào khác nhau:

>>>

>>> def truncate[n]:
...     return int[n * 1000] / 1000
0

Giống như

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03, bạn có thể chuyển giá trị âm sang
>>> def truncate[n]:
...     return int[n * 1000] / 1000
48:

>>>

>>> def truncate[n]:
...     return int[n * 1000] / 1000
1

Giống như

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03, bạn có thể chuyển giá trị âm sang
>>> def truncate[n]:
...     return int[n * 1000] / 1000
48:

Khi bạn chuyển một số âm cho

>>> def truncate[n]:
...     return int[n * 1000] / 1000
48, số trong đối số đầu tiên của
>>> def truncate[n]:
...     return int[n * 1000] / 1000
68 được làm tròn đến số chữ số chính xác ở bên trái của dấu thập phân.

>>>

>>> def truncate[n]:
...     return int[n * 1000] / 1000
2

Giống như

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03, bạn có thể chuyển giá trị âm sang
>>> def truncate[n]:
...     return int[n * 1000] / 1000
48:

Khi bạn chuyển một số âm cho

>>> def truncate[n]:
...     return int[n * 1000] / 1000
48, số trong đối số đầu tiên của
>>> def truncate[n]:
...     return int[n * 1000] / 1000
68 được làm tròn đến số chữ số chính xác ở bên trái của dấu thập phân.

Hãy đoán xem những gì

>>> def truncate[n]:
...     return int[n * 1000] / 1000
81 trả về:

>>> def truncate[n]:
...     return int[n * 1000] / 1000
82 những gì bạn mong đợi?

Nếu bạn kiểm tra logic được sử dụng trong việc xác định ____ ____ 168, cụ thể, cách hàm

>>> def truncate[n]:
...     return int[n * 1000] / 1000
61 hoạt động thì điều đó có ý nghĩa là
>>> def truncate[n]:
...     return int[n * 1000] / 1000
81 trả về
>>> def truncate[n]:
...     return int[n * 1000] / 1000
82. Tuy nhiên, một số người tự nhiên mong đợi tính đối xứng xung quanh số 0 khi làm tròn các số, do đó nếu
def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier
3 được làm tròn lên đến
def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier
6, thì
>>> def truncate[n]:
...     return int[n * 1000] / 1000
89 sẽ được làm tròn lên đến
>>> def truncate[n]:
...     return int[n * 1000] / 1000
90.

Hãy để thiết lập một số thuật ngữ. Đối với các mục đích của chúng tôi, chúng tôi sẽ sử dụng các thuật ngữ làm tròn lên và các vòng tròn xuống theo sơ đồ sau:

Làm tròn lên bên phải và xuống bên trái. [Hình ảnh: David Amos]

Làm tròn luôn làm tròn một số vào bên phải trên dòng số và làm tròn xuống luôn làm tròn một số vào bên trái trên dòng số.Làm tròn xuốngĐối tác của nhóm làm tròn lên trên mạng là chiến lược làm tròn của người Viking, luôn làm tròn một số xuống một số chữ số được chỉ định. Dưới đây là một số ví dụ minh họa chiến lược này:
12.345 Giá trị10
12.345 Làm tròn xuống12
12.345 Kết quả12.3
12.345 Hàng chục nơi12.34

Những người

Vị trí thứ mười

Vị trí hàng trăm

>>>

>>> def truncate[n]:
...     return int[n * 1000] / 1000
3

Để thực hiện chiến lược làm tròn xuống của người Viking trong Python, chúng ta có thể tuân theo cùng một thuật toán mà chúng tôi đã sử dụng cho cả

>>> def truncate[n]:
...     return int[n * 1000] / 1000
91 và
>>> def truncate[n]:
...     return int[n * 1000] / 1000
68. Đầu tiên chuyển điểm thập phân, sau đó làm tròn sang một số nguyên, và cuối cùng thay đổi dấu thập phân trở lại.

>>> def truncate[n]:
...     return int[n * 1000] / 1000
4

Trong

>>> def truncate[n]:
...     return int[n * 1000] / 1000
68, chúng tôi đã sử dụng
>>> def truncate[n]:
...     return int[n * 1000] / 1000
61 để làm tròn lên trần của số sau khi chuyển điểm thập phân. Tuy nhiên, đối với chiến lược làm tròn xuống của người Viking, chúng ta cần làm tròn lên sàn của số sau khi chuyển điểm thập phân.

May mắn cho chúng tôi, mô -đun

>>> def truncate[n]:
...     return int[n * 1000] / 1000
50 có chức năng
>>> def truncate[n]:
...     return int[n * 1000] / 1000
96 trả về sàn của đầu vào của nó:

>>>

>>> def truncate[n]:
...     return int[n * 1000] / 1000
5

Ở đây, định nghĩa của

>>> def truncate[n]:
...     return int[n * 1000] / 1000
97:

Trông giống như

>>> def truncate[n]:
...     return int[n * 1000] / 1000
68, ngoại trừ
>>> def truncate[n]:
...     return int[n * 1000] / 1000
61 đã được thay thế bằng
>>> actual_value, truncated_value = 100, 100
00.

Bạn có thể kiểm tra
>>> def truncate[n]:
...     return int[n * 1000] / 1000
97 trên một vài giá trị khác nhau:

Những ảnh hưởng của

>>> def truncate[n]:
...     return int[n * 1000] / 1000
68 và
>>> def truncate[n]:
...     return int[n * 1000] / 1000
97 có thể khá cực đoan. Bằng cách làm tròn các số trong một bộ dữ liệu lớn lên hoặc xuống, bạn có khả năng loại bỏ một tấn độ chính xác và thay đổi mạnh mẽ các tính toán được tạo từ dữ liệu.

Trước khi chúng tôi thảo luận về bất kỳ chiến lược làm tròn nào nữa, hãy để dừng lại và dành một chút thời gian để nói về cách làm tròn có thể làm cho dữ liệu của bạn bị sai lệch.

Interlude: Bias làm tròn

Bây giờ bạn đã thấy ba phương pháp làm tròn:

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03,
>>> def truncate[n]:
...     return int[n * 1000] / 1000
68 và
>>> def truncate[n]:
...     return int[n * 1000] / 1000
97. Tất cả ba kỹ thuật này đều khá thô khi bảo tồn một lượng chính xác hợp lý cho một số nhất định.

Có một sự khác biệt quan trọng giữa

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03 và
>>> def truncate[n]:
...     return int[n * 1000] / 1000
68 và
>>> def truncate[n]:
...     return int[n * 1000] / 1000
97 làm nổi bật một khía cạnh quan trọng của việc làm tròn: đối xứng xung quanh 0.rounding bias, which describes how rounding affects numeric data in a dataset.

Hãy nhớ lại rằng

>>> def truncate[n]:
...     return int[n * 1000] / 1000
68 isn đối xứng xung quanh số không. Theo thuật ngữ toán học, một hàm f [x] đối xứng xung quanh 0 nếu, đối với bất kỳ giá trị nào của x, f [x] + f [-x] = 0. Ví dụ,
>>> actual_value, truncated_value = 100, 100
11 trả về
def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier
6, nhưng
>>> def truncate[n]:
...     return int[n * 1000] / 1000
81 trả về
>>> def truncate[n]:
...     return int[n * 1000] / 1000
64. Hàm
>>> def truncate[n]:
...     return int[n * 1000] / 1000
97 cũng không đối xứng khoảng 0.round towards positive infinity bias, because the value is always rounded up in the direction of positive infinity. Likewise, the “rounding down” strategy has a round towards negative infinity bias.

Mặt khác, hàm

>>> def truncate[n]:
...     return int[n * 1000] / 1000
03 là đối xứng xung quanh 0. Điều này là bởi vì, sau khi chuyển điểm thập phân sang bên phải,
>>> def truncate[n]:
...     return int[n * 1000] / 1000
03 cắt các chữ số còn lại. Khi giá trị ban đầu là dương, số tiền này sẽ làm tròn số xuống. Số âm được làm tròn lên. Vì vậy,
>>> actual_value, truncated_value = 100, 100
18 trả về
>>> def truncate[n]:
...     return int[n * 1000] / 1000
53 và
>>> actual_value, truncated_value = 100, 100
20 trả về
>>> def truncate[n]:
...     return int[n * 1000] / 1000
64.round towards zero bias, in general.

Khái niệm đối xứng giới thiệu khái niệm về độ lệch làm tròn, mô tả cách làm tròn ảnh hưởng đến dữ liệu số trong bộ dữ liệu.

>>>

>>> def truncate[n]:
...     return int[n * 1000] / 1000
6

Hãy để tính toán giá trị trung bình của các giá trị trong

>>> actual_value, truncated_value = 100, 100
22 bằng hàm
>>> actual_value, truncated_value = 100, 100
23:

>>>

>>> def truncate[n]:
...     return int[n * 1000] / 1000
7

Bây giờ áp dụng từng

>>> def truncate[n]:
...     return int[n * 1000] / 1000
68,
>>> def truncate[n]:
...     return int[n * 1000] / 1000
97 và
>>> def truncate[n]:
...     return int[n * 1000] / 1000
03 trong danh sách hiểu để làm tròn từng số trong
>>> actual_value, truncated_value = 100, 100
22 đến một vị trí thập phân và tính giá trị trung bình mới:

>>>

>>> def truncate[n]:
...     return int[n * 1000] / 1000
8

Sau khi mỗi số trong

>>> actual_value, truncated_value = 100, 100
22 được làm tròn, giá trị trung bình mới là khoảng
>>> actual_value, truncated_value = 100, 100
29, lớn hơn giá trị trung bình thực tế của
>>> actual_value, truncated_value = 100, 100
30. Làm tròn xuống dịch chuyển trung bình xuống khoảng
>>> actual_value, truncated_value = 100, 100
31. Giá trị trung bình của các giá trị bị cắt là khoảng
>>> actual_value, truncated_value = 100, 100
32 và là giá trị gần nhất với giá trị trung bình thực tế.

Ví dụ này không ngụ ý rằng bạn nên luôn luôn cắt ngắn khi bạn cần làm tròn các giá trị riêng lẻ trong khi bảo tồn giá trị trung bình càng gần càng tốt. Danh sách

>>> actual_value, truncated_value = 100, 100
22 chứa số lượng giá trị dương và âm bằng nhau. Hàm
>>> def truncate[n]:
...     return int[n * 1000] / 1000
03 sẽ hoạt động giống như
>>> def truncate[n]:
...     return int[n * 1000] / 1000
68 trên danh sách tất cả các giá trị dương và giống như
>>> def truncate[n]:
...     return int[n * 1000] / 1000
97 trên danh sách tất cả các giá trị âm.

Những gì ví dụ này minh họa là độ lệch làm tròn hiệu ứng có trên các giá trị được tính toán từ dữ liệu đã được làm tròn. Bạn sẽ cần phải ghi nhớ những hiệu ứng này khi rút ra kết luận từ dữ liệu đã được làm tròn.

Thông thường, khi làm tròn, bạn quan tâm đến việc làm tròn đến số gần nhất với một số độ chính xác được chỉ định, thay vì chỉ làm tròn mọi thứ lên hoặc xuống.

Ví dụ: nếu ai đó yêu cầu bạn làm tròn các số

>>> actual_value, truncated_value = 100, 100
37 và
>>> actual_value, truncated_value = 100, 100
38 đến một vị trí thập phân, có lẽ bạn sẽ phản hồi nhanh chóng với
>>> def truncate[n]:
...     return int[n * 1000] / 1000
52 và
>>> actual_value, truncated_value = 100, 100
40. Các chức năng
>>> def truncate[n]:
...     return int[n * 1000] / 1000
03,
>>> def truncate[n]:
...     return int[n * 1000] / 1000
68 và
>>> def truncate[n]:
...     return int[n * 1000] / 1000
97 don don làm bất cứ điều gì như thế này.

Còn số

>>> actual_value, truncated_value = 100, 100
44 thì sao? Bạn có thể nghĩ ngay lập tức để làm tròn điều này đến
>>> actual_value, truncated_value = 100, 100
40, nhưng trong thực tế,
>>> actual_value, truncated_value = 100, 100
44 là tương đương từ
>>> def truncate[n]:
...     return int[n * 1000] / 1000
52 và
>>> actual_value, truncated_value = 100, 100
40. Theo một nghĩa nào đó,
>>> def truncate[n]:
...     return int[n * 1000] / 1000
52 và
>>> actual_value, truncated_value = 100, 100
40 đều là những con số gần nhất đến
>>> actual_value, truncated_value = 100, 100
44 với độ chính xác của số thập phân. Số
>>> actual_value, truncated_value = 100, 100
44 được gọi là cà vạt liên quan đến
>>> def truncate[n]:
...     return int[n * 1000] / 1000
52 và
>>> actual_value, truncated_value = 100, 100
40. Trong các trường hợp như thế này, bạn phải chỉ định một kẻ phá vỡ.tie with respect to
>>> def truncate[n]:
...     return int[n * 1000] / 1000
52 and
>>> actual_value, truncated_value = 100, 100
40. In cases like this, you must assign a tiebreaker.

Cách mà hầu hết mọi người được dạy về mối quan hệ phá vỡ là bằng cách làm tròn đến các số lớn hơn của hai con số có thể.

Làm tròn một nửa lên

Chiến lược làm tròn một nửa của người Viking lên từng số vào số gần nhất với độ chính xác được chỉ định và phá vỡ các mối quan hệ bằng cách làm tròn. Dưới đây là một số ví dụ:

Giá trịVòng một nửa lên đếnKết quả
13.825 Hàng chục nơi10
13.825 Những người14
13.825 Vị trí thứ mười13.8
13.825 Vị trí hàng trăm13.83

Để thực hiện chiến lược nửa vòng tròn của người Viking trong Python, bạn bắt đầu như thường lệ bằng cách chuyển điểm thập phân sang bên phải bởi số lượng địa điểm mong muốn. Tuy nhiên, tại thời điểm này, bạn cần một cách để xác định xem chữ số ngay sau điểm thập phân thay đổi nhỏ hơn hoặc lớn hơn hoặc bằng

>>> actual_value, truncated_value = 100, 100
55.

Một cách để làm điều này là thêm

>>> actual_value, truncated_value = 100, 100
56 vào giá trị đã thay đổi và sau đó làm tròn với
>>> actual_value, truncated_value = 100, 100
00. Điều này hoạt động bởi vì:

  • Nếu chữ số ở vị trí thập phân đầu tiên của giá trị thay đổi nhỏ hơn năm, thì thêm

    >>> actual_value, truncated_value = 100, 100
    
    56 won Thay đổi phần số nguyên của giá trị dịch chuyển, do đó sàn bằng phần nguyên.

  • Nếu chữ số đầu tiên sau vị trí thập phân lớn hơn hoặc bằng

    >>> actual_value, truncated_value = 100, 100
    
    55, thì việc thêm
    >>> actual_value, truncated_value = 100, 100
    
    56 sẽ tăng phần số nguyên của giá trị dịch chuyển bằng
    >>> def truncate[n]:
    ...     return int[n * 1000] / 1000
    
    53, do đó sàn bằng số nguyên lớn hơn này.

Ở đây, những gì nó trông giống như trong Python:

>>> def truncate[n]:
...     return int[n * 1000] / 1000
9

Lưu ý rằng

>>> actual_value, truncated_value = 100, 100
62 trông rất giống
>>> def truncate[n]:
...     return int[n * 1000] / 1000
97. Điều này có thể có phần phản trực giác, nhưng bên trong
>>> actual_value, truncated_value = 100, 100
62 chỉ làm tròn. Bí quyết là thêm
>>> actual_value, truncated_value = 100, 100
56 sau khi chuyển điểm thập phân để kết quả làm tròn xuống phù hợp với giá trị dự kiến.

Hãy để thử nghiệm

>>> actual_value, truncated_value = 100, 100
62 trên một vài giá trị để thấy rằng nó hoạt động:

>>>

>>> actual_value, truncated_value = 100, 100
0

>>> actual_value, truncated_value = 100, 100
62 luôn phá vỡ các mối quan hệ bằng cách làm tròn đến các giá trị lớn hơn của hai giá trị có thể, các giá trị âm như
>>> def truncate[n]:
...     return int[n * 1000] / 1000
89 tròn đến
>>> def truncate[n]:
...     return int[n * 1000] / 1000
64, không phải là
>>> def truncate[n]:
...     return int[n * 1000] / 1000
90:

>>>

>>> actual_value, truncated_value = 100, 100
1

Tuyệt quá! Bây giờ bạn cuối cùng có thể nhận được kết quả đó rằng chức năng

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 tích hợp từ chối cho bạn:

>>>

>>> actual_value, truncated_value = 100, 100
2

Mặc dù trước khi bạn quá phấn khích, hãy để Lừa xem điều gì sẽ xảy ra khi bạn cố gắng và làm tròn

>>> actual_value, truncated_value = 100, 100
72 đến
def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier
6 Các vị trí thập phân:

>>>

>>> actual_value, truncated_value = 100, 100
3

Chờ đợi. Chúng tôi vừa thảo luận về cách các mối quan hệ được làm tròn đến các giá trị lớn hơn của hai giá trị có thể.

>>> actual_value, truncated_value = 100, 100
72 bị đập vào giữa
>>> actual_value, truncated_value = 100, 100
75 và
>>> actual_value, truncated_value = 100, 100
76. Vì
>>> actual_value, truncated_value = 100, 100
75 là lớn hơn của hai người này,
>>> actual_value, truncated_value = 100, 100
78 sẽ trả lại
>>> actual_value, truncated_value = 100, 100
75. Nhưng thay vào đó, chúng tôi có
>>> actual_value, truncated_value = 100, 100
76.

Có lỗi trong hàm

>>> actual_value, truncated_value = 100, 100
62 không?

Khi

>>> actual_value, truncated_value = 100, 100
62 vòng
>>> actual_value, truncated_value = 100, 100
72 đến hai vị trí thập phân, điều đầu tiên nó làm là nhân
>>> actual_value, truncated_value = 100, 100
72 với
>>> def truncate[n]:
...     return int[n * 1000] / 1000
11. Hãy để đảm bảo rằng điều này hoạt động như mong đợi:

>>>

>>> actual_value, truncated_value = 100, 100
4

Vâng, đó là sai! Nhưng nó giải thích tại sao

>>> actual_value, truncated_value = 100, 100
78 trả về -1,23. Hãy để tiếp tục các bước từng bước
>>> actual_value, truncated_value = 100, 100
62, sử dụng
>>> def truncate[n]:
...     return int[n * 1000] / 1000
23 trong bản phát hành để nhớ lại đầu ra giá trị cuối cùng ở mỗi bước:

>>>

>>> actual_value, truncated_value = 100, 100
5

Mặc dù

>>> actual_value, truncated_value = 100, 100
89 thực sự gần với
>>> actual_value, truncated_value = 100, 100
90, số nguyên gần nhất nhỏ hơn hoặc bằng với nó là
>>> actual_value, truncated_value = 100, 100
91. Khi điểm thập phân được chuyển trở lại bên trái, giá trị cuối cùng là
>>> actual_value, truncated_value = 100, 100
76.

Chà, bây giờ bạn biết làm thế nào

>>> actual_value, truncated_value = 100, 100
78 trả về
>>> actual_value, truncated_value = 100, 100
76 mặc dù không có lỗi logic, nhưng tại sao Python nói rằng
>>> actual_value, truncated_value = 100, 100
95 là
>>> actual_value, truncated_value = 100, 100
96? Có lỗi trong Python không?

Thực tế là Python nói rằng

>>> actual_value, truncated_value = 100, 100
95 là
>>> actual_value, truncated_value = 100, 100
96 là một tạo tác của lỗi biểu diễn điểm nổi. Bạn có thể tự hỏi mình, được rồi, nhưng có cách nào để khắc phục điều này không? Một câu hỏi hay hơn để tự hỏi mình là "Tôi có cần sửa cái này không?"

Các số điểm nổi không có độ chính xác chính xác, và do đó không nên được sử dụng trong các tình huống trong đó độ chính xác là tối quan trọng. Đối với các ứng dụng có độ chính xác chính xác là cần thiết, bạn có thể sử dụng lớp

>>> actual_value, truncated_value = 100, 100
99 từ mô -đun PythonTHER
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00. Bạn sẽ tìm hiểu thêm về lớp
>>> actual_value, truncated_value = 100, 100
99 dưới đây.should not be used in situations where precision is paramount. For applications where the exact precision is necessary, you can use the
>>> actual_value, truncated_value = 100, 100
99 class from Python’s
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00 module. You’ll learn more about the
>>> actual_value, truncated_value = 100, 100
99 class below.

Nếu bạn đã xác định rằng lớp

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
02 tiêu chuẩn của Python là đủ cho ứng dụng của bạn, một số lỗi không thường xuyên trong
>>> actual_value, truncated_value = 100, 100
62 do lỗi biểu diễn điểm nổi nên là một mối quan tâm.

Bây giờ, bạn đã nhận được một hương vị về cách các số máy tròn trong bộ nhớ, hãy để tiếp tục thảo luận về các chiến lược làm tròn bằng cách nhìn vào một cách khác để phá vỡ một chiếc cà vạt.

Làm tròn một nửa xuống

Chiến lược làm tròn một nửa xuống, các vòng tròn với số gần nhất với độ chính xác mong muốn, giống như phương pháp làm tròn một nửa lên, ngoại trừ việc nó phá vỡ mối quan hệ bằng cách làm tròn vào số ít hơn trong hai số. Dưới đây là một số ví dụ:

Giá trịVòng một nửa xuốngKết quả
13.825 Hàng chục nơi10
13.825 Những người14
13.825 Vị trí thứ mười13.8
13.825 Vị trí hàng trăm13.82

Bạn có thể thực hiện chiến lược nửa làm tròn xuống trong Python bằng cách thay thế

>>> actual_value, truncated_value = 100, 100
00 trong hàm
>>> actual_value, truncated_value = 100, 100
62 bằng
>>> def truncate[n]:
...     return int[n * 1000] / 1000
61 và trừ
>>> actual_value, truncated_value = 100, 100
56 thay vì thêm: thêm:

>>> actual_value, truncated_value = 100, 100
6

Hãy để kiểm tra

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
08 so với một vài trường hợp thử nghiệm:

>>>

>>> actual_value, truncated_value = 100, 100
7

Cả

>>> actual_value, truncated_value = 100, 100
62 và
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
08 không có sai lệch nói chung. Tuy nhiên, việc làm tròn dữ liệu với rất nhiều mối quan hệ sẽ giới thiệu sự thiên vị. Ví dụ cực đoan, hãy xem xét danh sách các số sau:

>>>

>>> actual_value, truncated_value = 100, 100
8

Hãy để tính toán giá trị trung bình của các số sau:

>>>

>>> actual_value, truncated_value = 100, 100
9

Tiếp theo, tính toán giá trị trung bình trên dữ liệu sau khi làm tròn đến một vị trí thập phân với

>>> actual_value, truncated_value = 100, 100
62 và
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
08:

>>>

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
0

Mỗi số trong

>>> actual_value, truncated_value = 100, 100
22 là một sự ràng buộc liên quan đến việc làm tròn đến một vị trí thập phân. Hàm
>>> actual_value, truncated_value = 100, 100
62 giới thiệu một vòng hướng tới sai lệch vô cực dương và
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
08 giới thiệu một vòng hướng tới sai lệch vô cực tiêu cực.

Các chiến lược làm tròn còn lại mà chúng tôi sẽ thảo luận về tất cả các nỗ lực để giảm thiểu những thành kiến ​​này theo những cách khác nhau.

Làm tròn một nửa so với số không

Nếu bạn kiểm tra chặt chẽ

>>> actual_value, truncated_value = 100, 100
62 và
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
08, bạn sẽ nhận thấy rằng cả hai chức năng này đều không đối xứng xung quanh 0:

>>>

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
1

Một cách để giới thiệu đối xứng là luôn luôn làm tròn một chiếc cà vạt từ số không. Bảng sau đây minh họa cách thức hoạt động của nó:

Giá trịVòng một nửa xuốngKết quả
15.25 Hàng chục nơi20
15.25 Những người15
15.25 Vị trí thứ mười15.3
-15.25 Hàng chục nơi-20
-15.25 Những người-15
-15.25 Vị trí thứ mười-15.3

Vị trí hàng trăm

  1. Bạn có thể thực hiện chiến lược nửa làm tròn xuống trong Python bằng cách thay thế
    >>> actual_value, truncated_value = 100, 100
    
    00 trong hàm
    >>> actual_value, truncated_value = 100, 100
    
    62 bằng
    >>> def truncate[n]:
    ...     return int[n * 1000] / 1000
    
    61 và trừ
    >>> actual_value, truncated_value = 100, 100
    
    56 thay vì thêm: thêm:
  2. Hãy để kiểm tra
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    08 so với một vài trường hợp thử nghiệm:
  3. Cả
    >>> actual_value, truncated_value = 100, 100
    
    62 và
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    08 không có sai lệch nói chung. Tuy nhiên, việc làm tròn dữ liệu với rất nhiều mối quan hệ sẽ giới thiệu sự thiên vị. Ví dụ cực đoan, hãy xem xét danh sách các số sau:
  4. Hãy để tính toán giá trị trung bình của các số sau:

Tiếp theo, tính toán giá trị trung bình trên dữ liệu sau khi làm tròn đến một vị trí thập phân với

>>> actual_value, truncated_value = 100, 100
62 và
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
08:

Mỗi số trong

>>> actual_value, truncated_value = 100, 100
22 là một sự ràng buộc liên quan đến việc làm tròn đến một vị trí thập phân. Hàm
>>> actual_value, truncated_value = 100, 100
62 giới thiệu một vòng hướng tới sai lệch vô cực dương và
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
08 giới thiệu một vòng hướng tới sai lệch vô cực tiêu cực.

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
2

Các chiến lược làm tròn còn lại mà chúng tôi sẽ thảo luận về tất cả các nỗ lực để giảm thiểu những thành kiến ​​này theo những cách khác nhau.

Làm tròn một nửa so với số không

Nếu bạn kiểm tra chặt chẽ

>>> actual_value, truncated_value = 100, 100
62 và
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
08, bạn sẽ nhận thấy rằng cả hai chức năng này đều không đối xứng xung quanh 0:

>>>

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
3

Lưu ý rằng

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
36 trả về
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
02, mặc dù cả hai đối số của nó đều là số nguyên.

Sử dụng

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
33,
>>> actual_value, truncated_value = 100, 100
62 và
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
36, bạn có thể thực hiện một nửa vòng tròn từ chiến lược không có trong hai dòng Python:

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
4

Trong

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
47, giá trị tuyệt đối của
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 được làm tròn đến
>>> def truncate[n]:
...     return int[n * 1000] / 1000
48 Các vị trí thập phân bằng cách sử dụng
>>> actual_value, truncated_value = 100, 100
62 và kết quả này được gán cho biến
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
51. Sau đó, dấu hiệu ban đầu của
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
6 được áp dụng cho
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
51 bằng cách sử dụng
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
36 và giá trị cuối cùng này với dấu hiệu chính xác được trả về bởi hàm.

Kiểm tra

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
47 Trên một vài giá trị khác nhau cho thấy hàm hoạt động như mong đợi:

>>>

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
5

Hàm

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
47 làm tròn số theo cách mà hầu hết mọi người có xu hướng tròn số trong cuộc sống hàng ngày. Bên cạnh đó là chức năng làm tròn quen thuộc nhất mà bạn đã thấy cho đến nay,
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
47 còn loại bỏ sự phân tán tròn trong các bộ dữ liệu có số lượng tương đương các mối quan hệ tích cực và tiêu cực.

Hãy để kiểm tra mức độ

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
47 giảm thiểu sai lệch làm tròn trong ví dụ từ phần trước:

>>>

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
6

Giá trị trung bình của các số trong

>>> actual_value, truncated_value = 100, 100
22 được bảo tồn gần như chính xác khi bạn làm tròn từng số trong
>>> actual_value, truncated_value = 100, 100
22 đến một vị trí thập phân với
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
47!

Tuy nhiên,

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
47 sẽ thể hiện sự thiên vị làm tròn khi bạn làm tròn mọi số trong các bộ dữ liệu chỉ có mối quan hệ tích cực, chỉ có mối quan hệ tiêu cực hoặc nhiều mối quan hệ của một dấu hiệu hơn giá trị kia. Sự thiên vị chỉ được giảm thiểu tốt nếu có một số lượng tương tự các mối quan hệ tích cực và tiêu cực trong bộ dữ liệu.

Làm thế nào để bạn xử lý các tình huống trong đó số lượng mối quan hệ tích cực và tiêu cực khác nhau đáng kể? Câu trả lời cho câu hỏi này đưa chúng ta đến vòng tròn đầy đủ cho chức năng đã lừa dối chúng ta khi bắt đầu bài viết này: Chức năng

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 tích hợp của Python.

Làm tròn một nửa để thậm chí

Một cách để giảm thiểu độ lệch làm tròn khi làm tròn các giá trị trong bộ dữ liệu là các mối quan hệ tròn đến số gần nhất ở độ chính xác mong muốn. Dưới đây là một số ví dụ về cách làm điều đó:

Giá trịVòng một nửa để thậm chíKết quả
15.255 Hàng chục nơi20
15.255 Những người15
15.255 Vị trí thứ mười15.3
15.255 Vị trí hàng trăm15.26

Một nửa làm tròn cho chiến lược thậm chí là chiến lược được sử dụng bởi chức năng

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 tích hợp của Python và là quy tắc làm tròn mặc định trong tiêu chuẩn IEEE-754. Chiến lược này hoạt động theo giả định rằng xác suất của một sự ràng buộc trong bộ dữ liệu được làm tròn hoặc làm tròn lên bằng nhau. Trong thực tế, đây thường là trường hợp.

Bây giờ bạn biết tại sao

def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier
9 trả về
def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier
6. Nó không phải là một sai lầm. Đó là một quyết định thiết kế có ý thức dựa trên các khuyến nghị vững chắc.

Để chứng minh cho chính mình rằng

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 thực sự làm tròn để thậm chí, hãy thử nó trên một vài giá trị khác nhau:

>>>

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
7

Hàm

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 gần như không có sai lệch, nhưng nó không hoàn hảo. Ví dụ, độ lệch làm tròn vẫn có thể được giới thiệu nếu phần lớn các mối quan hệ trong bộ dữ liệu của bạn làm tròn lên đến ngay cả thay vì làm tròn xuống. Các chiến lược giảm thiểu sự thiên vị thậm chí còn tốt hơn so với một nửa làm tròn với thậm chí còn tồn tại, nhưng chúng có phần mơ hồ và chỉ cần thiết trong hoàn cảnh khắc nghiệt.

Cuối cùng,

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 bị trục trặc tương tự mà bạn đã thấy trong
>>> actual_value, truncated_value = 100, 100
62 nhờ lỗi biểu diễn điểm nổi:

>>>

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
8

Bạn không nên quan tâm đến những lỗi không thường xuyên này nếu độ chính xác điểm nổi là đủ cho ứng dụng của bạn.

Khi độ chính xác là tối quan trọng, bạn nên sử dụng lớp Python từ ____299.

Lớp
>>> actual_value, truncated_value = 100, 100
99

Mô-đun thập phân Python sườn là một trong những tính năng bao gồm các loại pin của các ngôn ngữ mà bạn có thể không biết nếu bạn mới sử dụng Python. Nguyên tắc hướng dẫn của mô -đun

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00 có thể được tìm thấy trong tài liệu:

Decimal, dựa trên mô hình dấu phẩy động được thiết kế với mọi người và nhất thiết phải có một nguyên tắc hướng dẫn tối quan trọng-máy tính phải cung cấp một số học hoạt động theo cách tương tự như số học mà mọi người học ở trường. - Đoạn trích từ đặc điểm số học thập phân. [Nguồn]

Những lợi ích của mô -đun

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00 bao gồm:

  • Đại diện thập phân chính xác:
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    75 thực sự là
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    75 và
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    77 trả về
    >>> def truncate[n]:
    ...     return int[n * 1000] / 1000
    
    20, như bạn mong đợi.
    :
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    75 is actually
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    75, and
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    77 returns
    >>> def truncate[n]:
    ...     return int[n * 1000] / 1000
    
    20, as you’d expect.
  • Bảo tồn các chữ số quan trọng: Khi bạn thêm
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    79 và
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    80, kết quả là
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    81 với số 0 được duy trì để chỉ ra ý nghĩa.
    : When you add
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    79 and
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    80, the result is
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    81 with the trailing zero maintained to indicate significance.
  • Độ chính xác thay đổi của người dùng: Độ chính xác mặc định của mô-đun
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    00 là hai mươi tám chữ số, nhưng giá trị này có thể được người dùng thay đổi để phù hợp với vấn đề trong tay.
    : The default precision of the
    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    00 module is twenty-eight digits, but this value can be altered by the user to match the problem at hand.

Hãy cùng khám phá cách làm việc làm tròn hoạt động trong mô -đun

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00. Bắt đầu bằng cách nhập phần sau vào Python Repls:

>>>

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
9

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
84 Trả về một đối tượng
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
85 đại diện cho bối cảnh mặc định của mô -đun
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00. Bối cảnh bao gồm độ chính xác mặc định và chiến lược làm tròn mặc định, trong số những thứ khác.

Như bạn có thể thấy trong ví dụ trên, chiến lược làm tròn mặc định cho mô -đun

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00 là
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
88. Điều này phù hợp với chức năng
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 tích hợp và phải là chiến lược làm tròn ưa thích cho hầu hết các mục đích.

Hãy cùng khai báo một số bằng cách sử dụng lớp

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00 ____ ____299. Để làm như vậy, hãy tạo một thể hiện
>>> actual_value, truncated_value = 100, 100
99 mới bằng cách chuyển
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
93 chứa giá trị mong muốn:

>>>

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
0

Chỉ để giải trí, hãy để thử nghiệm khẳng định rằng

>>> actual_value, truncated_value = 100, 100
99 duy trì biểu diễn thập phân chính xác:

>>>

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
1

Ahhh. Điều đó thỏa mãn, phải không?

Làm tròn một

>>> actual_value, truncated_value = 100, 100
99 được thực hiện với phương pháp
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
96:

>>>

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
2

Được rồi, có lẽ trông hơi vui, vì vậy hãy để điều đó phá vỡ điều đó. Đối số

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
97 trong
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
96 xác định số lượng vị trí thập phân để làm tròn số. Vì
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
99 có một vị trí thập phân, số lượng
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
00 đến một vị trí thập phân duy nhất. Chiến lược làm tròn mặc định là một nửa làm tròn đến một nửa, vì vậy kết quả là
>>> import math

>>> math.ceil[1.2]
2

>>> math.ceil[2]
2

>>> math.ceil[-0.5]
0
9.

Hãy nhớ lại rằng chức năng

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4, cũng sử dụng một nửa làm tròn cho chiến lược, đã không chính xác để làm tròn
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
03 đến hai số thập phân. Thay vì
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
04,
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
05 trả về
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
06. Nhờ các mô -đun
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00 đại diện thập phân chính xác, bạn đã giành được vấn đề này với lớp
>>> actual_value, truncated_value = 100, 100
99:

>>>

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
3

Một lợi ích khác của mô -đun

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00 là làm tròn sau khi thực hiện số học được chăm sóc tự động và các chữ số quan trọng được bảo tồn. Để xem điều này trong hành động, hãy để thay đổi độ chính xác mặc định từ hai mươi tám chữ số thành hai, sau đó thêm các số
>>> actual_value, truncated_value = 100, 100
37 và
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
11:

>>>

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
4

Để thay đổi độ chính xác, bạn gọi

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
84 và đặt thuộc tính
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
13. Nếu đặt thuộc tính trên một cuộc gọi hàm có vẻ kỳ lạ với bạn, bạn có thể làm điều này bởi vì
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
14 trả về một đối tượng
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
85 đặc biệt đại diện cho bối cảnh nội bộ hiện tại chứa các tham số mặc định được sử dụng bởi mô -đun
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00.

Giá trị chính xác của

>>> actual_value, truncated_value = 100, 100
37 cộng với
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
11 là
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
19. Vì độ chính xác hiện là hai chữ số và chiến lược làm tròn được đặt thành mặc định là một nửa làm tròn thành chẵn, nên giá trị
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
19 được tự động làm tròn thành
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
21.

Để thay đổi chiến lược làm tròn mặc định, bạn có thể đặt thuộc tính

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
22 thành bất kỳ một trong nhiều cờ. Bảng sau đây tóm tắt các cờ này và chiến lược làm tròn mà họ thực hiện:

Lá cờChiến lược làm tròn
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
23
Tập trung
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
24
Làm tròn xuống
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
25
Cắt ngắn
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
26
Làm tròn từ số không
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
27
Làm tròn một nửa so với số không
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
28
Làm tròn một nửa về phía 0
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
29
Làm tròn một nửa để thậm chí
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
30
Làm tròn và làm tròn về phía 0

Điều đầu tiên cần chú ý là sơ đồ đặt tên được sử dụng bởi mô -đun

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00 khác với những gì chúng tôi đã đồng ý trước đó trong bài viết. Ví dụ,
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
26 thực hiện các vòng tròn từ chiến lược không có, thực sự làm tròn các số âm.

Thứ hai, một số chiến lược làm tròn được đề cập trong bảng có thể trông không quen thuộc kể từ khi chúng ta đã thảo luận về chúng. Bạn đã thấy cách thức hoạt động của

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
29, vì vậy, hãy để xem xét từng người khác trong hành động.

Chiến lược

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
23 hoạt động giống như hàm
>>> def truncate[n]:
...     return int[n * 1000] / 1000
68 mà chúng tôi đã xác định trước đó:

>>>

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
5

Lưu ý rằng kết quả của

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
23 không đối xứng xung quanh 0.

Chiến lược

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
24 hoạt động giống như hàm
>>> def truncate[n]:
...     return int[n * 1000] / 1000
97 của chúng tôi:

>>>

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
6

Giống như

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
23, chiến lược
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
24 không đối xứng xung quanh 0.

Các chiến lược

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
25 và
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
26 có những cái tên lừa đảo có phần. Cả
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
43 và
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
44 đều đối xứng xung quanh 0:

>>>

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
7

Chiến lược

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
25 làm tròn các số về 0, giống như hàm
>>> def truncate[n]:
...     return int[n * 1000] / 1000
03. Mặt khác,
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
26 làm tròn mọi thứ từ số không. Đây là một sự phá vỡ rõ ràng từ thuật ngữ mà chúng tôi đã đồng ý trước đó trong bài viết, vì vậy hãy ghi nhớ điều đó khi bạn đang làm việc với mô -đun
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00.

Có ba chiến lược trong mô -đun

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00 cho phép làm tròn nhiều sắc thái hơn. Phương pháp
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
27 làm tròn mọi thứ theo số gần nhất và phá vỡ mối quan hệ bằng cách làm tròn từ số không:

>>>

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
8

Lưu ý rằng

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
27 hoạt động giống như
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
47 của chúng tôi và không thích
>>> actual_value, truncated_value = 100, 100
62.

Ngoài ra còn có một chiến lược

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
28 phá vỡ mối quan hệ bằng cách làm tròn về 0:

>>>

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
9

Chiến lược làm tròn cuối cùng có sẵn trong mô -đun

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00 rất khác với bất cứ điều gì chúng ta đã thấy cho đến nay:

>>>

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
0

Trong các ví dụ trên, có vẻ như

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
30 làm tròn mọi thứ về 0. Trên thực tế, đây chính xác là cách
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
30 hoạt động, trừ khi kết quả của việc làm tròn kết thúc trong một
>>> def truncate[n]:
...     return int[n * 1000] / 1000
20 hoặc
>>> actual_value, truncated_value = 100, 100
55. Trong trường hợp đó, số được làm tròn khỏi số không:

>>>

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
1

Trong ví dụ đầu tiên, số

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
60 lần đầu tiên được làm tròn về 0 ở vị trí thập phân thứ hai, tạo ra
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
61. Vì
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
61 không kết thúc trong một
>>> def truncate[n]:
...     return int[n * 1000] / 1000
20 hoặc
>>> actual_value, truncated_value = 100, 100
55, nên nó được để lại như vậy. Mặt khác,
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
65 được làm tròn về 0 ở vị trí thập phân thứ hai, dẫn đến số
def round_up[n, decimals=0]:
    multiplier = 10 ** decimals
    return math.ceil[n * multiplier] / multiplier
3. Điều này kết thúc ở một
>>> actual_value, truncated_value = 100, 100
55, vì vậy vị trí thập phân đầu tiên sau đó được làm tròn từ số 0 đến
>>> import math

>>> math.ceil[1.2]
2

>>> math.ceil[2]
2

>>> math.ceil[-0.5]
0
9.

Trong phần này, chúng tôi chỉ tập trung vào các khía cạnh làm tròn của mô -đun

>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00. Có một số lượng lớn các tính năng khác làm cho
>>> import random
>>> random.seed[100]

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     truncated_value = truncate[truncated_value + randn]
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00 trở thành một lựa chọn tuyệt vời cho các ứng dụng trong đó độ chính xác dấu phẩy động tiêu chuẩn là không đủ, chẳng hạn như ngân hàng và một số vấn đề trong điện toán khoa học.

Để biết thêm thông tin về

>>> actual_value, truncated_value = 100, 100
99, hãy xem hướng dẫn bắt đầu nhanh trong các tài liệu Python.

Tiếp theo, hãy để chúng tôi chú ý sang hai mặt hàng chủ lực của các ngăn xếp khoa học và máy tính khoa học Python,: Numpy và Pandas.

Làm tròn mảng numpy

Trong các lĩnh vực của khoa học dữ liệu và điện toán khoa học, bạn thường lưu trữ dữ liệu của mình dưới dạng

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
72. Một trong những tính năng mạnh mẽ nhất của Numpy, là việc sử dụng vector hóa và phát sóng để áp dụng các hoạt động cho toàn bộ mảng cùng một lúc thay vì một yếu tố tại một thời điểm.

Hãy để tạo ra một số dữ liệu bằng cách tạo một mảng số giả ngẫu nhiên 3 × 4:

>>>

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
2

Đầu tiên, chúng tôi gieo hạt mô -đun

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
73 để bạn có thể dễ dàng tái tạo đầu ra. Sau đó, một mảng số điểm nổi 3 × 4 được tạo bằng
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
74.

Để làm tròn tất cả các giá trị trong mảng

>>> actual_value, truncated_value = 100, 100
22, bạn có thể chuyển
>>> actual_value, truncated_value = 100, 100
22 làm đối số cho hàm
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
77. Số lượng vị trí thập phân mong muốn được đặt với đối số từ khóa
>>> def truncate[n]:
...     return int[n * 1000] / 1000
48. Một nửa vòng cho chiến lược thậm chí được sử dụng, giống như chức năng ____64 tích hợp của Python.

Ví dụ: các vòng sau tất cả các giá trị trong

>>> actual_value, truncated_value = 100, 100
22 đến ba số thập phân:

>>>

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
3

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
77 là sự thương xót của lỗi biểu diễn dấu phẩy động, giống như
>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
4 là.

Ví dụ: giá trị trong hàng thứ ba của cột đầu tiên trong mảng

>>> actual_value, truncated_value = 100, 100
22 là
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
84. Khi bạn làm tròn số này đến ba vị trí thập phân bằng cách sử dụng một nửa làm tròn cho chiến lược thậm chí là, bạn mong đợi giá trị sẽ là
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
85. Nhưng bạn có thể thấy trong đầu ra từ
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
77 rằng giá trị được làm tròn thành
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
87. Tuy nhiên, giá trị
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
88 trong hàng đầu tiên của cột thứ hai chính xác là
>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
89.

Nếu bạn cần làm tròn dữ liệu trong mảng của mình vào số nguyên, Numpy cung cấp một số tùy chọn:

  • >>> random.seed[100]
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     rounded_value = round[rounded_value + randn, 3]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    90
  • >>> random.seed[100]
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     rounded_value = round[rounded_value + randn, 3]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    91
  • >>> random.seed[100]
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     rounded_value = round[rounded_value + randn, 3]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    92
  • >>> random.seed[100]
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     rounded_value = round[rounded_value + randn, 3]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    93

Hàm

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
94 làm tròn mọi giá trị trong mảng đến số nguyên gần nhất lớn hơn hoặc bằng giá trị ban đầu:

>>>

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
4

Này, chúng tôi đã phát hiện ra một số mới! Số 0 tiêu cực!

Trên thực tế, tiêu chuẩn IEEE-754 yêu cầu thực hiện cả số 0 dương và âm. Những gì có thể sử dụng là có một cái gì đó như thế này? Wikipedia biết câu trả lời:

Không chính thức, người ta có thể sử dụng ký hiệu của

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
95, cho một giá trị âm được làm tròn về 0. Ký hiệu này có thể hữu ích khi một dấu hiệu tiêu cực là đáng kể; Ví dụ, khi lập bảng nhiệt độ Celsius, trong đó một dấu hiệu tiêu cực có nghĩa là dưới mức đóng băng. [Nguồn]

Để làm tròn mọi giá trị xuống số nguyên gần nhất, hãy sử dụng

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
96:

>>>

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
5

Bạn cũng có thể cắt từng giá trị thành thành phần số nguyên của nó với

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
97:

>>>

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
6

Cuối cùng, để làm tròn đến số nguyên gần nhất bằng cách sử dụng một nửa làm tròn cho chiến lược thậm chí là sử dụng

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
98:

>>>

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
7

Bạn có thể nhận thấy rằng rất nhiều chiến lược làm tròn mà chúng tôi đã thảo luận trước đó bị thiếu ở đây. Đối với phần lớn các tình huống, hàm

>>> random.seed[100]
>>> actual_value, rounded_value = 100, 100

>>> for _ in range[1000000]:
...     randn = random.uniform[-0.05, 0.05]
...     actual_value = actual_value + randn
...     rounded_value = round[rounded_value + randn, 3]
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
99 là tất cả những gì bạn cần. Nếu bạn cần thực hiện một chiến lược khác, chẳng hạn như
>>> actual_value, truncated_value = 100, 100
62, bạn có thể làm như vậy với một sửa đổi đơn giản:

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
8

Nhờ các hoạt động vector hóa của Numpy, điều này hoạt động giống như bạn mong đợi:

>>>

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
9

Bây giờ, bạn là một bậc thầy tròn trịa, hãy cùng xem Python, Khoa học dữ liệu nặng nề khác: Thư viện Pandas.

Làm tròn Pandas
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
01 và
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
02

Thư viện Pandas đã trở thành một yếu tố chính cho các nhà khoa học dữ liệu và các nhà phân tích dữ liệu làm việc trong Python. Theo lời của Joe Wyndham thực sự của Python:

Pandas là một người thay đổi trò chơi cho khoa học và phân tích dữ liệu, đặc biệt nếu bạn đến Python vì bạn đang tìm kiếm một thứ gì đó mạnh mẽ hơn Excel và VBA. [Nguồn]

Hai cấu trúc dữ liệu gấu trúc chính là

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
02, theo thuật ngữ rất lỏng lẻo hoạt động giống như bảng tính Excel và
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
01, mà bạn có thể nghĩ như một cột trong bảng tính. Cả hai đối tượng
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
01 và
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
02 cũng có thể được làm tròn hiệu quả bằng các phương pháp
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
07 và
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
08:

>>>

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
0

Phương pháp

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
08 cũng có thể chấp nhận từ điển hoặc
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
01, để chỉ định độ chính xác khác nhau cho mỗi cột. Chẳng hạn, các ví dụ sau đây cho thấy cách làm tròn cột đầu tiên của
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
11 đến một vị trí thập phân, vị trí thứ hai đến hai và vị trí thứ ba đến ba thập phân:

>>>

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
1

Phương pháp

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
08 cũng có thể chấp nhận từ điển hoặc
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
01, để chỉ định độ chính xác khác nhau cho mỗi cột. Chẳng hạn, các ví dụ sau đây cho thấy cách làm tròn cột đầu tiên của
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
11 đến một vị trí thập phân, vị trí thứ hai đến hai và vị trí thứ ba đến ba thập phân:

>>>

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
2

Phương pháp

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
08 cũng có thể chấp nhận từ điển hoặc
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
01, để chỉ định độ chính xác khác nhau cho mỗi cột. Chẳng hạn, các ví dụ sau đây cho thấy cách làm tròn cột đầu tiên của
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
11 đến một vị trí thập phân, vị trí thứ hai đến hai và vị trí thứ ba đến ba thập phân:

>>>

>>> truncate[12.5]
12.0

>>> truncate[-5.963, 1]
-5.9

>>> truncate[1.625, 2]
1.62
3

Phương pháp

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
08 cũng có thể chấp nhận từ điển hoặc
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
01, để chỉ định độ chính xác khác nhau cho mỗi cột. Chẳng hạn, các ví dụ sau đây cho thấy cách làm tròn cột đầu tiên của
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
11 đến một vị trí thập phân, vị trí thứ hai đến hai và vị trí thứ ba đến ba thập phân:

Nếu bạn cần sự linh hoạt làm tròn hơn, bạn có thể áp dụng các hàm Numpy ____ ____196,

>>> def truncate[n]:
...     return int[n * 1000] / 1000
49 và
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
14 cho các đối tượng Pandas
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
01 và
def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
02:

Hàm
>>> actual_value, truncated_value = 100, 100
62 đã sửa đổi từ phần trước cũng sẽ hoạt động ở đây:

Xin chúc mừng, bạn rất tốt trên đường để làm tròn thành thạo! Bây giờ bạn biết rằng có nhiều cách để làm tròn một số hơn là có sự kết hợp của taco. .

Có một bước nữa: biết khi nào nên áp dụng chiến lược phù hợp.

Các ứng dụng và thực tiễn tốt nhất

Sự kéo dài cuối cùng trên con đường của bạn để làm tròn sự điêu luyện là sự hiểu biết khi nào nên áp dụng kiến ​​thức mới của bạn. Trong phần này, bạn sẽ học một số thực tiễn tốt nhất để đảm bảo bạn làm tròn số của mình đúng cách.

Lưu trữ nhiều hơn và tròn muộn

Khi bạn xử lý các bộ dữ liệu lớn, lưu trữ có thể là một vấn đề. Trong hầu hết các cơ sở dữ liệu quan hệ, mỗi cột trong bảng được thiết kế để lưu trữ một loại dữ liệu cụ thể và các loại dữ liệu số thường được gán chính xác để giúp bảo tồn bộ nhớ.

Ví dụ, một cảm biến nhiệt độ có thể báo cáo nhiệt độ trong lò công nghiệp kéo dài cứ sau mười giây chính xác đến tám chữ số thập phân. Các bài đọc từ điều này được sử dụng để phát hiện sự dao động bất thường về nhiệt độ có thể chỉ ra sự thất bại của một yếu tố sưởi ấm hoặc một số thành phần khác. Vì vậy, có thể có một kịch bản Python chạy so sánh mỗi lần đọc đến cuối cùng để kiểm tra các biến động lớn.

Các bài đọc từ cảm biến này cũng được lưu trữ trong cơ sở dữ liệu SQL để nhiệt độ trung bình hàng ngày bên trong lò có thể được tính toán mỗi ngày vào nửa đêm. Nhà sản xuất phần tử sưởi ấm bên trong lò khuyến nghị thay thế thành phần bất cứ khi nào nhiệt độ trung bình hàng ngày giảm

def truncate[n, decimals=0]:
    multiplier = 10 ** decimals
    return int[n * multiplier] / multiplier
20 độ dưới mức bình thường.

Đối với tính toán này, bạn chỉ cần ba vị trí chính xác thập phân. Nhưng bạn biết từ vụ việc tại Sở giao dịch chứng khoán Vancouver rằng việc loại bỏ quá nhiều độ chính xác có thể ảnh hưởng đáng kể đến tính toán của bạn.

Nếu bạn có sẵn không gian, bạn nên lưu trữ dữ liệu ở mức độ chính xác đầy đủ. Nếu lưu trữ là một vấn đề, một quy tắc tốt là lưu trữ ít nhất hai hoặc ba vị trí chính xác thập phân hơn bạn cần cho tính toán của mình.

Cuối cùng, khi bạn tính toán nhiệt độ trung bình hàng ngày, bạn nên tính toán nó với độ chính xác đầy đủ có sẵn và làm tròn câu trả lời cuối cùng.

Tuân thủ các quy định nội tệ

Khi bạn gọi một tách cà phê với giá 2,40 đô la tại quán cà phê, thương gia thường thêm thuế cần thiết. Số tiền thuế đó phụ thuộc rất nhiều vào nơi bạn ở địa lý, nhưng vì lợi ích của cuộc tranh luận, hãy để nói rằng nó đã nói 6%. Thuế được thêm vào được đưa ra tới 0,144 đô la. Bạn có nên làm tròn số tiền này lên đến $ 0,15 hoặc xuống $ 0,14? Câu trả lời có thể phụ thuộc vào các quy định được quy định bởi chính quyền địa phương!

Nếu bạn đang thiết kế phần mềm để tính toán tiền tệ, bạn phải luôn kiểm tra luật pháp và quy định địa phương tại các địa điểm của người dùng.

Khi nghi ngờ, các mối quan hệ tròn để thậm chí

Khi bạn làm tròn các số trong các bộ dữ liệu lớn được sử dụng trong các tính toán phức tạp, mối quan tâm chính là hạn chế sự tăng trưởng của lỗi do làm tròn.

Trong tất cả các phương pháp mà chúng tôi đã thảo luận trong bài viết này, một nửa làm tròn cho chiến lược thậm chí của người dùng giảm thiểu sự thiên vị làm tròn tốt nhất. May mắn thay, Python, Numpy và Pandas đều mặc định cho chiến lược này, vì vậy bằng cách sử dụng các chức năng làm tròn tích hợp mà bạn đã được bảo vệ tốt!

Bản tóm tắt

Whew! Thật là một hành trình này đã được!

Trong bài viết này, bạn đã học được điều đó:

  • Có nhiều chiến lược làm tròn khác nhau, bây giờ bạn biết cách thực hiện trong Python thuần túy.

  • Mỗi chiến lược làm tròn vốn đã đưa ra một thiên vị làm tròn, và một nửa làm tròn cho chiến lược thậm chí là giảm thiểu sự thiên vị này, hầu hết thời gian.

  • Cách mà các máy tính lưu trữ các số điểm nổi trong bộ nhớ tự nhiên đưa ra một lỗi làm tròn tinh tế, nhưng bạn đã học được cách làm việc xung quanh điều này với mô-đun

    >>> import random
    >>> random.seed[100]
    
    >>> for _ in range[1000000]:
    ...     randn = random.uniform[-0.05, 0.05]
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate[truncated_value + randn]
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    00 trong thư viện tiêu chuẩn Python.

  • Bạn có thể làm tròn các mảng numpy và gấu trúc

    def truncate[n, decimals=0]:
        multiplier = 10 ** decimals
        return int[n * multiplier] / multiplier
    
    01 và
    def truncate[n, decimals=0]:
        multiplier = 10 ** decimals
        return int[n * multiplier] / multiplier
    
    02 đối tượng.

  • Có những thực tiễn tốt nhất để làm tròn với dữ liệu trong thế giới thực.

Nếu bạn quan tâm đến việc tìm hiểu thêm và đào sâu vào các chi tiết lớn của tất cả mọi thứ chúng tôi đã đề cập, các liên kết dưới đây sẽ khiến bạn bận rộn khá lâu.

Ít nhất, nếu bạn đã thích bài viết này và học được điều gì đó mới từ nó, hãy chuyển nó cho một người bạn hoặc thành viên trong nhóm! Hãy chắc chắn để chia sẻ suy nghĩ của bạn với chúng tôi trong các ý kiến. Chúng tôi rất thích nghe một số câu chuyện chiến đấu liên quan đến làm tròn của riêng bạn!

Happy Pythoning!

Tài nguyên bổ sung

Chiến lược làm tròn và thiên vị:

  • Vòng tròn, Wikipedia
  • Các số làm tròn mà không cần thêm sai lệch, từ zipcpu

Thông số kỹ thuật nổi và số thập phân:

  • IEEE-754, Wikipedia
  • Thông số số học thập phân chung của IBM

Những bài đọc thú vị:

  • Những gì mọi nhà khoa học máy tính nên biết về số học nổi, David Goldberg, Khảo sát điện toán ACM, tháng 3 năm 1991
  • Số học dấu nổi: Các vấn đề và hạn chế, từ python.org
  • Tại sao các tầng phân chia số nguyên Python, bởi Guido Van Rossum

Vòng 2,5 để làm gì trong Python?

Đó là một thuật toán đơn giản! Ví dụ, số 2,5 được làm tròn đến số toàn bộ gần nhất là 3. Số 1,64 được làm tròn đến một vị trí thập phân là 1.6. Bây giờ hãy mở một phiên phiên dịch và vòng 2.5 đến số toàn bộ gần nhất bằng cách sử dụng chức năng vòng [] tích hợp của Python: >>> >>> vòng [2.5] 2.the number 2.5 rounded to the nearest whole number is 3 . The number 1.64 rounded to one decimal place is 1.6 . Now open up an interpreter session and round 2.5 to the nearest whole number using Python's built-in round[] function: >>> >>> round[2.5] 2.

Làm thế nào để bạn làm tròn đến 3 chữ số thập phân ở Python?

Sử dụng hàm vòng [] để làm tròn một chiếc phao đến 3 thập phân, ví dụ:Kết quả = vòng [6.36789, 3].Hàm vòng [] sẽ làm tròn số điểm nổi đến 3 vị trí thập phân và sẽ trả về kết quả.Đã sao chép!, e.g. result = round[6.36789, 3] . The round[] function will round the floating-point number to 3 decimal places and will return the result. Copied!

2,5 làm tròn lên hay xuống?

Quy tắc làm tròn như sau: Nếu số ở bên phải của vị trí có ý nghĩa [toàn bộ số] là 5 hoặc cao hơn, bạn sẽ làm tròn. Nếu nó dưới 5, bạn làm tròn xuống.2.5, 5 là số bên cạnh toàn bộ số [2].Vì 5 nằm trong danh mục từ 5 trở lên, 2 vòng lên đến 3.if the number to the right of the place of significance [whole number] is 5 or above, you round up. if it is below 5, you round down. 2.5, the 5 is the number next to the whole number [2]. since 5 is in the category of 5 or above, the 2 rounds up to 3.

Python có vòng 0,5 lên hay xuống không?

Đối với 0,5, nó làm tròn lên.For = 0,5, hàm vòng [] làm tròn số đến số chẵn gần nhất.Vì vậy, 0,5 được làm tròn về 0, và -0,5;33,5 và 34,5 đều được làm tròn đến 34;-33,5 -34,5 đều được làm tròn đến -34, v.v.. For =0.5, the round[] function rounds the number off to the nearest even number. So, 0.5 is rounded to zero, and so is -0.5; 33.5 and 34.5 are both rounded off to 34; -33.5 -34.5 are both rounded off to -34, and so on.

Bài Viết Liên Quan

Chủ Đề