Hướng dẫn round up in python - làm tròn trong con trăn



Hàm round() trong Python làm tròn x về n chữ số sau dấu thập phân. Python làm tròn theo cách sau: round(0.5) là 1.0 và round(-0.5) là -1.0round() trong Python làm tròn x về n chữ số sau dấu thập phân. Python làm tròn theo cách sau: round(0.5) là 1.0 và round(-0.5) là -1.0

Show

Cú pháp

Cú pháp của round() trong Python:round() trong Python:

Các tham số:

  • x: Đây là một biểu thức số.: Đây là một biểu thức số.

  • n: Đây cũng là một biểu thức số.: Đây cũng là một biểu thức số.


Ví dụ sau minh họa cách sử dụng của hàm round() trong Python.

print ("round(50.25556, 2) : ", round(50.25556, 2)) print ("round(10.000056, 3) : ", round(10.000056, 3)) print ("round(-10.000056, 3) : ", round(-10.000056, 3))

Chạy chương trình Python trên sẽ cho kết quả:

round(50.25556, 2) : 50.26 round(10.000056, 3) : 10.0 round(-10.000056, 3) : -10.0





Hàm Round () trong python lÀm trngn x về n chữ số Sau dấu thập Phân. Python lÀm Tròn Theo Cách Sau: Round (0,5) Là 1.0 Và Round (-0.5) Là -1.0round() trong Python làm tròn x về n chữ số sau dấu thập phân. Python làm tròn theo cách sau: round(0.5) là 1.0 và round(-0.5) là -1.0


  • Cú phápp
    • Cú Pháp Hàm Round () Trong Python:
    • Các Tham Số CủA Hài
    • Giá trị trả về từ vòng ()
    • Ví dụ 1: Round () hoạt Động NHư thế nào?
    • Ví dụ 2: lÀm trngn số đến vị trí ndigits
    • Đăng nhập
  • Chức năng vòng () Python tích hợp ()
  • Bao nhiêu tác động có thể làm tròn có?
  • Một người đàn ông của các phương pháp
    • Cắt ngắn
    • Tập trung
    • Làm tròn xuống
    • Interlude: Bias làm tròn
    • Làm tròn một nửa lên
    • Làm tròn một nửa xuống
    • Làm tròn một nửa so với số không
    • Làm tròn một nửa để thậm chí
  • Lớp thập phân
  • Làm tròn mảng numpy
  • Sê -ri Gấu trúc tròn và DataFrame
  • Các ứng dụng và thực tiễn tốt nhất
    • Lưu trữ nhiều hơn và tròn muộn
    • Tuân thủ các quy định nội tệ
    • Khi nghi ngờ, các mối quan hệ tròn để thậm chí
  • Bản tóm tắt
  • Tài nguyên bổ sung

Cú phápp

Cú Pháp Hàm Round () Trong Python:round() trong Python:

Các Tham Số CủA Hài

Hướng dẫn round up in python - làm tròn trong con trăn

Giá trị trả về từ vòng ()


Ví dụ 1: Round () hoạt Động NHư thế nào?

Ví dụ 2: lÀm trngn số đến vị trí ndigits

Đăng nhập

Hướng dẫn round up in python - làm tròn trong con trăn

Giá trị trả về từ vòng ()

Ví dụ 1: Round () hoạt Động NHư thế nào?



Ví dụ 2: lÀm trngn số đến vị trí ndigits

Đăng nhập

Hướng dẫn round up in python - làm tròn trong con trăn

Giá trị trả về từ vòng ()

  • Ví dụ 1: Round () hoạt Động NHư thế nào?
  • Ví dụ 2: lÀm trngn số đến vị trí ndigits
  • Đăng nhập
  • Chức năng vòng () Python tích hợp ()
  • Bao nhiêu tác động có thể làm tròn có?
  • Một người đàn ông của các phương pháp
  • Cắt ngắn
  • Tập trung
  • Làm tròn xuống
  • Interlude: Bias làm tròn
  • Làm tròn một nửa lên
  • Làm tròn một nửa xuống
  • Làm tròn một nửa so với số không
  • Làm tròn một nửa để thậm chí
  • Lớp thập phân
  • Làm tròn mảng numpy
  • Sê -ri Gấu trúc tròn và DataFrame
  • Các ứng dụng và thực tiễn tốt nhất
  • Lưu trữ nhiều hơn và tròn muộn
  • Tuân thủ các quy định nội tệ
  • Cú Pháp Của Round () Trong Python:
  • Các Tham Số:
  • Hướng dẫn làm tròn python
  • Ví dụ Sau Minh Họa Cách Sử dụng Của Hàm Round () Trong Python.

In (Vòng tròn (50.25556, 2): Vòng, Vòng (50.25556, 2)) in (Vòng tròn (10.000056, 3): Vòng, Vòng (10.000056, 3)) , tròn (-10.000056, 3)) trong Python làm tròn một số cho trước, trả về số đó dưới dạng số dấu phẩy động, có số chữ số sau dấu phẩy được chỉ định. Số sau dấu phẩy mặc định là 0, nghĩa là hàm sẽ trả về số nguyên gần nhất.

Cú Pháp Hàm Round () Trong Python:

round(number[, ndigits])

Các Tham Số CủA Hài

Hàm round() có 2 tham số:

  • >>> actual_value, truncated_value = 100, 100
    8: Số bạn muốn làm tròn.
  • >>> actual_value, truncated_value = 100, 100
    9: Số chữ số sau dấu phẩy muốn sử dụng làm tròn số. Mặc định là 0.

Giá trị trả về từ round()

  • Nếu không có 
    >>> actual_value, truncated_value = 100, 100
    9, hàm sẽ trả về số nguyên gần nhất.
  • Nếu cung cấp đủ 2 tham số, hàm trả về 
    >>> actual_value, truncated_value = 100, 100
    8 với 
    >>> actual_value, truncated_value = 100, 100
    9 số thập phân sau dấu phẩy.

Ví dụ 1: round() hoạt động như thế nào?

Ví dụ chỉ truyền tham số đầu tiên:

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))

Khi bạn chạy chương trình, output trả về sẽ là:

101165701

Ví dụ 2: Làm tròn số đến vị trí ndigits đã cho

Ví dụ truyền đủ cả 2 tham số:

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))

Khi bạn chạy chương trình, output trả về sẽ là:

2.6750.26100.080.23122.145

Ví dụ 2: Làm tròn số đến vị trí ndigits đã cho

Ví dụ truyền đủ cả 2 tham số:

Đăng nhập

  • It’s the era of big data, and every day more and more business are trying to leverage their data to make informed decisions. Many businesses are turning to Python’s powerful data science ecosystem to analyze their data, as evidenced by Python’s rising popularity in the data science realm.
  • Nội dung chính
  • Python’s Built-in round() Function
  • How Much Impact Can Rounding Have?
  • A Menagerie of Methods
  • Rounding Up
  • Rounding Down
  • Interlude: Rounding Bias
  • Rounding Half Up
  • Rounding Half Down
  • Rounding Half Away From Zero
  • Rounding Half To Even
  • The Decimal Class
  • Rounding NumPy Arrays
  • Rounding Pandas Series and DataFrame
  • Applications and Best Practices
  • Store More and Round Late
  • Obey Local Currency Regulations

When In Doubt, Round Ties To Even

Additional Resources

One thing every data science practitioner must keep in mind is how a dataset may be biased. Drawing conclusions from biased data can lead to costly mistakes.

  • There are many ways bias can creep into a dataset. If you’ve studied some statistics, you’re probably familiar with terms like reporting bias, selection bias and sampling bias. There is another type of bias that plays an important role when you are dealing with numeric data: rounding bias.
  • In this article, you will learn:
  • Why the way you round numbers is important
  • How to round a number according to various rounding strategies, and how to implement each method in pure Python
  • How rounding affects data, and which rounding strategy minimizes this effect

How to round numbers in NumPy arrays and Pandas DataFrames

When to apply different rounding strategies

This article is not a treatise on numeric precision in computing, although we will touch briefly on the subject. Only a familiarity with the fundamentals of Python is necessary, and the math involved here should feel comfortable to anyone familiar with the equivalent of high school algebra.

Let’s start by looking at Python’s built-in rounding mechanism.

Python’s Built-in round() Function

Python has a built-in

>>> 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_value96.45273913513529>>> truncated_value0.239
3 function that takes two numeric arguments,
>>> 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_value96.45273913513529>>> truncated_value0.239
4 and
>>> actual_value, truncated_value = 100, 100
9, and returns the number
>>> 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_value96.45273913513529>>> truncated_value0.239
4 rounded to
>>> actual_value, truncated_value = 100, 100
9. The
>>> actual_value, truncated_value = 100, 100
9 argument defaults to zero, so leaving it out results in a number rounded to an integer. As you’ll see,
>>> 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_value96.45273913513529>>> truncated_value0.239
3 may not work quite as you expect.

The way most people are taught to round a number goes something like this:

Round the number

>>> 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_value96.45273913513529>>> truncated_value0.239
4 to
>>> 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_value96.45273913513529>>> rounded_value96.258
1 decimal places by first shifting the decimal point in
>>> 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_value96.45273913513529>>> truncated_value0.239
4 by
>>> 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_value96.45273913513529>>> rounded_value96.258
1 places by multiplying
>>> 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_value96.45273913513529>>> truncated_value0.239
4 by 10ᵖ (10 raised to the
>>> 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_value96.45273913513529>>> rounded_value96.258
1th power) to get a new number
>>> 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_value96.45273913513529>>> rounded_value96.258
6.

Then look at the digit

>>> 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_value96.45273913513529>>> rounded_value96.258
7 in the first decimal place of
>>> 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_value96.45273913513529>>> rounded_value96.258
6. If
>>> 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_value96.45273913513529>>> rounded_value96.258
7 is less than 5, round
>>> 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_value96.45273913513529>>> rounded_value96.258
6 down to the nearest integer. Otherwise, round
>>> 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_value96.45273913513529>>> rounded_value96.258
6 up.

Finally, shift the decimal point back

>>> 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_value96.45273913513529>>> rounded_value96.258
1 places by dividing
>>> 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_value96.45273913513529>>> rounded_value96.258
6 by 10ᵖ.

It’s a straightforward algorithm! For example, the number

def truncate(n, decimals=0): multiplier = 10 ** decimals return int(n * multiplier) / multiplier
4 rounded to the nearest whole number is
def truncate(n, decimals=0): multiplier = 10 ** decimals return int(n * multiplier) / multiplier
5. The number
def truncate(n, decimals=0): multiplier = 10 ** decimals return int(n * multiplier) / multiplier
6 rounded to one decimal place is
def truncate(n, decimals=0): multiplier = 10 ** decimals return int(n * multiplier) / multiplier
7.

Now open up an interpreter session and round

def truncate(n, decimals=0): multiplier = 10 ** decimals return int(n * multiplier) / multiplier
4 to the nearest whole number using Python’s built-in
>>> 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_value96.45273913513529>>> truncated_value0.239
3 function:

Gasp!

How does

>>> 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_value96.45273913513529>>> truncated_value0.239
3 handle the number
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
01?

So,

>>> 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_value96.45273913513529>>> truncated_value0.239
3 rounds
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
01 up to
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
04, and
def truncate(n, decimals=0): multiplier = 10 ** decimals return int(n * multiplier) / multiplier
4 down to
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
04!

Before you go raising an issue on the Python bug tracker, let me assure you that

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
07 is supposed to return
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
04. There is a good reason why
>>> 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_value96.45273913513529>>> truncated_value0.239
3 behaves the way it does.

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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11 cắt ngắn một số xuống ba số thập phân:

>>>

>>> def truncate(n):...  return int(n * 1000) / 1000

Hàm

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11 hoạt động bằng cách đầu tiên chuyển điểm thập phân trong 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_value96.45273913513529>>> truncated_value0.239
4 ba vị trí bên phải bằng cách nhâ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_value96.45273913513529>>> truncated_value0.239
4 với
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
15. Phần số nguyên của số mới này được thực hiện với
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
16. Cuối cùng, điểm thập phân được chuyển ba vị trí trở lại bên trái bằng cách chia
>>> 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_value96.45273913513529>>> truncated_value0.239
4 cho
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
15.

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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
19:

>>>

>>> actual_value, truncated_value = 100, 100

Hàm

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11 hoạt động bằng cách đầu tiên chuyển điểm thập phân trong 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_value96.45273913513529>>> truncated_value0.239
4 ba vị trí bên phải bằng cách nhâ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_value96.45273913513529>>> truncated_value0.239
4 với
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
15. Phần số nguyên của số mới này được thực hiện với
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
16. Cuối cùng, điểm thập phân được chuyển ba vị trí trở lại bên trái bằng cách chia
>>> 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_value96.45273913513529>>> truncated_value0.239
4 cho
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
15.

>>>

>>> 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_value96.45273913513529>>> truncated_value0.239

Hàm

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11 hoạt động bằng cách đầu tiên chuyển điểm thập phân trong 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_value96.45273913513529>>> truncated_value0.239
4 ba vị trí bên phải bằng cách nhâ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_value96.45273913513529>>> truncated_value0.239
4 với
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
15. Phần số nguyên của số mới này được thực hiện với
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
16. Cuối cùng, điểm thập phân được chuyển ba vị trí trở lại bên trái bằng cách chia
>>> 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_value96.45273913513529>>> truncated_value0.239
4 cho
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
15.

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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
19:

Bây giờ, hãy để Lôi chạy mô phỏng trong 1.000.000 giây (khoảng 11,5 ngày). Với mỗi giây, tạo một giá trị ngẫu nhiên giữa

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
20 và
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
21 với hàm
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
22 trong mô -đun
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
23, sau đó cập nhật
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
24 và
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
25:

>>>

>>> 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_value96.45273913513529>>> rounded_value96.258

Hàm

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11 hoạt động bằng cách đầu tiên chuyển điểm thập phân trong 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_value96.45273913513529>>> truncated_value0.239
4 ba vị trí bên phải bằng cách nhâ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_value96.45273913513529>>> truncated_value0.239
4 với
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
15. Phần số nguyên của số mới này được thực hiện với
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
16. Cuối cùng, điểm thập phân được chuyển ba vị trí trở lại bên trái bằng cách chia
>>> 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_value96.45273913513529>>> truncated_value0.239
4 cho
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
15.

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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
19:

Bây giờ, hãy để Lôi chạy mô phỏng trong 1.000.000 giây (khoảng 11,5 ngày). Với mỗi giây, tạo một giá trị ngẫu nhiên giữa # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))20 và # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))21 với hàm # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))22 trong mô -đun # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))23, sau đó cập nhật # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))24 và # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))25:

Thịt mô phỏng diễn ra trong vòng

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
26, lặp qua
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
27 của các số trong khoảng từ
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
28 và
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
29. Giá trị được lấy từ
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
30 ở mỗi bước được lưu trữ trong biến
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
31 mà chúng tôi sử dụng ở đây vì chúng tôi thực sự cần giá trị này bên trong vòng lặp.

Ở mỗi bước của vòng lặp, một số ngẫu nhiên mới giữa # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))20 và # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))21 được tạo bằng cách sử dụng # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))34 và được gán cho biến # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))35. Giá trị mới của khoản đầu tư của bạn được tính bằng cách thêm # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))35 vào # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))37 và tổng số bị cắt được tính bằng cách thêm # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))35 vào # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))39 và sau đó cắt ngắn giá trị này với # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))11.

Như bạn có thể thấy bằng cách kiểm tra biến

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
37 sau khi chạy vòng lặp, bạn chỉ mất khoảng 3,55 đô la. Tuy nhiên, nếu bạn đã nhìn vào
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
39, bạn đã nghĩ rằng bạn đã mất gần như tất cả số tiền của mình!

Giá trị Cắt ngắn để Kết quả
12.345 Hàng chục nơi 10
12.345 Những người 12
12.345 Vị trí thứ mười 12.3
12.345 Vị trí hàng trăm 12.34

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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11 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
    # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
    15 để thay đổi 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
    # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
    16
  • Chuyển vị trí thập phân ba vị trí trở lại bên trái bằng cách chia cho
    # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
    15

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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
15 bằng số 10ᵖ (
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
51 đượ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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11 này, đối số thứ hai mặc định là
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
28 để nếu không có đối số thứ hai được truyền cho hàm, thì
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11 sẽ trả về phần số nguyên của bất kỳ số nào được truyền cho nó.

Hàm

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11 hoạt động tốt cho cả số dương và số âm:

>>>

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
0

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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
56 để cắt ngắn thành các chữ số ở bên trái của dấu thập phân:

>>>

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
1

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
0

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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
56 để cắt ngắn thành các chữ số ở bên trái của dấu thập phân:

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.

Giá trị Tập trung Kết quả
12.345 Hàng chục nơi 20
12.345 Những người 13
12.345 Vị trí thứ mười 12.4
12.345 Vị trí hàng trăm 12.35

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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11 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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
15 để thay đổi 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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
16

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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
15ceiling 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
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
04 is
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
04.

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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
15 bằng số 10ᵖ (
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
51 đượ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:

>>>

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
2

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
0

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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
56 để cắt ngắn thành các chữ số ở bên trái của dấu thập phân:

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
3

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

>>>

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
4

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
0

>>>

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
5

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
0

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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
56 để cắt ngắn thành các chữ số ở bên trái của dấu thập phân:

>>>

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
6

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
0

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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
56 để cắt ngắn thành các chữ số ở bên trái của dấu thập phân:

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:

Giá trị Làm tròn xuống Kết quả
12.345 Hàng chục nơi 10
12.345 Những người 12
12.345 Vị trí thứ mười 12.3
12.345 Vị trí hàng trăm 12.34

Để 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ả

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
99 và
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
76. Đầ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.

Trong

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
76, chúng tôi đã sử dụng
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
69 để 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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
58 có chức năng
101165701
04 trả về sàn của đầu vào của nó:

>>>

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
7

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

101165701
05:

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
8

Trông giống như

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
76, ngoại trừ
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
69 đã được thay thế bằng
101165701
08.

Bạn có thể kiểm tra

101165701
05 trên một vài giá trị khác nhau:

>>>

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
9

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

101165701
05:

Trông giống như

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
76, ngoại trừ
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
69 đã được thay thế bằng
101165701
08.

Bạn có thể kiểm tra 10116570105 trên một vài giá trị khác nhau:

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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
76 và
101165701
05 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:

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11,
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
76 và
101165701
05. 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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11 và
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
76 và
101165701
05 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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
76 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ụ,
101165701
19 trả về
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
04, nhưng
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
89 trả về
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
72. Hàm
101165701
05 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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11 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,
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11 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,
101165701
26 trả về
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
61 và
101165701
28 trả về
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
72.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.

>>>

101165701
0

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

101165701
05:

>>>

101165701
1

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

101165701
05:

>>>

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

Trông giống như

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
76, ngoại trừ
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
69 đã được thay thế bằng
101165701
08.

Bạn có thể kiểm tra

101165701
05 trên một vài giá trị khác nhau:

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ố

101165701
45 và
101165701
46 đến một vị trí thập phân, có lẽ bạn sẽ phản hồi nhanh chóng với
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
60 và
101165701
48. Các chức năng
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11,
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
76 và
101165701
05 don don làm bất cứ điều gì như thế này.

Còn số

101165701
52 thì sao? Bạn có thể nghĩ ngay lập tức để làm tròn điều này đến
101165701
48, nhưng trong thực tế,
101165701
52 là tương đương từ
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
60 và
101165701
48. Theo một nghĩa nào đó,
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
60 và
101165701
48 đều là những con số gần nhất đến
101165701
52 với độ chính xác của số thập phân. Số
101165701
52 được gọi là cà vạt liên quan đến
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
60 và
101165701
48. 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
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
60 and
101165701
48. 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 đến Kết quả
13.825 Hàng chục nơi 10
13.825 Những người 14
13.825 Vị trí thứ mười 13.8
13.825 Vị trí hàng trăm 13.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

101165701
63.

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

101165701
64 vào giá trị đã thay đổi và sau đó làm tròn với
101165701
08. Đ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ì việc thêm

    101165701
    64 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

    101165701
    63, thì việc thêm
    101165701
    64 sẽ tăng phần số nguyên của giá trị dịch chuyển bằng
    # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
    61, do đó, sàn bằng với số nguyên lớn hơn này.

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

101165701
3

Lưu ý rằng

101165701
70 trông rất giống
101165701
05. Điều này có thể có phần phản trực giác, nhưng nội bộ ____270 chỉ làm tròn. Bí quyết là thêm
101165701
64 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

101165701
70 trên một vài giá trị để thấy rằng nó hoạt động:

>>>

101165701
4

101165701
70 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ư
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
97 tròn đến
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
72, không phải là
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
98:

>>>

101165701
5

101165701
70 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ư
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
97 tròn đến
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
72, không phải là
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
98:

>>>

101165701
6

101165701
70 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ư
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
97 tròn đến
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
72, không phải là
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
98:

>>>

101165701
7

101165701
70 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ư
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
97 tròn đến
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
72, không phải là
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
98:

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

>>> 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_value96.45273913513529>>> truncated_value0.239
3 tích hợp từ chối cho bạn:

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

101165701
80 đến
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
04 Số thập phân:

>>>

101165701
8

101165701
70 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ư
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
97 tròn đến
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
72, không phải là
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
98:

>>>

101165701
9

101165701
70 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ư
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
97 tròn đến
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
72, không phải là
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
98:

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

>>> 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_value96.45273913513529>>> truncated_value0.239
3 tích hợp từ chối cho bạn:

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

101165701
80 đến
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
04 Số thập phân:

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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
07 từ mô -đun PythonTHER
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08. Bạn sẽ tìm hiểu thêm về lớp
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
07 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
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
07 class from Python’s
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08 module. You’ll learn more about the
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
07 class below.

Nếu bạn đã xác định rằng lớp ____310 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

101165701
70 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ống Kết quả
13.825 Hàng chục nơi 10
13.825 Những người 14
13.825 Vị trí thứ mười 13.8
13.825 Vị trí hàng trăm 13.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ế

101165701
08 trong hàm
101165701
70 bằng
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
69 và trừ
101165701
64 thay vì thêm: thêm:

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
0

Hãy để kiểm tra

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
16 so với một vài trường hợp thử nghiệm:

>>>

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
1

Cả

101165701
70 và
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
16 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:

>>>

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
2

Cả

101165701
70 và
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
16 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:

>>>

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
3

Cả

101165701
70 và
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
16 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:

>>>

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
4

Cả

101165701
70 và
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
16 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:

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 10116570170 và print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))16:

Mỗi số trong

101165701
30 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
101165701
70 giới thiệu một vòng hướng tới sai lệch vô cực dương và
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
16 giới thiệu một vòng hướng tới sai lệch vô cực tiêu cực.

>>>

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
5

Cả

101165701
70 và
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
16 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:

Giá trị Vòng một nửa xuống Kết quả
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
-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ế
    101165701
    08 trong hàm
    101165701
    70 bằng
    # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
    69 và trừ
    101165701
    64 thay vì thêm: thêm:
  2. Hãy để kiểm tra
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    16 so với một vài trường hợp thử nghiệm:
  3. >>>
  4. Cả
    101165701
    70 và
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    16 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:

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

101165701
70 và
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
16:

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
6

Mỗi số trong

101165701
30 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
101165701
70 giới thiệu một vòng hướng tới sai lệch vô cực dương và
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
16 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

>>>

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
7

Cả

101165701
70 và
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
16 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:

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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
8

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

101165701
70 và
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
16:

Mỗi số trong

101165701
30 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
101165701
70 giới thiệu một vòng hướng tới sai lệch vô cực dương và
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
16 giới thiệu một vòng hướng tới sai lệch vô cực tiêu cực.

>>>

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
9

Cả

101165701
70 và
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
16 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:

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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
55 giảm thiểu sai lệch làm tròn trong ví dụ từ phần trước:

>>>

2.6750.26100.080.23122.145
0

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

101165701
30 được bảo tồn gần như chính xác khi bạn làm tròn từng số trong
101165701
30 đến một vị trí thập phân với
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
55!

Tuy nhiên,

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
55 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ị khác. 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

>>> 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_value96.45273913513529>>> truncated_value0.239
3 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ơi 20
15.255 Những người 15
15.255 Vị trí thứ mười 15.3
15.255 Vị trí hàng trăm 15.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

>>> 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_value96.45273913513529>>> truncated_value0.239
3 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

# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
07 trả về
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
04. 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

>>> 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_value96.45273913513529>>> truncated_value0.239
3 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:

>>>

2.6750.26100.080.23122.145
1

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_value96.45273913513529>>> truncated_value0.239
3 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,

>>> 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_value96.45273913513529>>> truncated_value0.239
3 bị trục trặc tương tự mà bạn đã thấy trong
101165701
70 nhờ lỗi biểu diễn điểm nổi:

>>>

2.6750.26100.080.23122.145
2

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ừ ____307.

Lớp thập phân

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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08 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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08 bao gồm:

  • Đại diện thập phân chính xác:
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    82 thực sự là
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    82 và
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    84 trả về
    # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
    28, như bạn mong đợi.
    :
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    82 is actually
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    82, and
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    84 returns
    # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
    28, as you’d expect.
  • Bảo tồn các chữ số quan trọng: Khi bạn thêm
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    86 và
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    87, kết quả là
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    88 với số 0 được duy trì để chỉ ra ý nghĩa.
    : When you add
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    86 and
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    87, the result is
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    88 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
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    08 là hai mươi tám chữ số, nhưng giá trị này có thể được người dùng thay đổi để khớp với vấn đề trong tay.
    : The default precision of the
    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    08 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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08. Bắt đầu bằng cách nhập phần sau vào Python Repls:

>>>

2.6750.26100.080.23122.145
3

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
91 Trả về một đối tượng
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
92 đại diện cho bối cảnh mặc định của mô -đun
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08. 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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08 là
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
95. Điều này phù hợp với chức nă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_value96.45273913513529>>> truncated_value0.239
3 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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
07. Để làm như vậy, hãy tạo một thể hiện
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
07 mới bằng cách chuyển
2.6750.26100.080.23122.145
00 chứa giá trị mong muốn:

>>>

2.6750.26100.080.23122.145
4

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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
07 duy trì biểu diễn thập phân chính xác:

>>>

2.6750.26100.080.23122.145
5

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

Làm tròn một

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
07 được thực hiện với phương pháp
2.6750.26100.080.23122.145
03:

>>>

2.6750.26100.080.23122.145
6

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

2.6750.26100.080.23122.145
04 trong
2.6750.26100.080.23122.145
03 xác định số lượng vị trí thập phân để làm tròn số. Vì
2.6750.26100.080.23122.145
06 có một vị trí thập phân, số
2.6750.26100.080.23122.145
07 vòng đế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à
def truncate(n, decimals=0): multiplier = 10 ** decimals return int(n * multiplier) / multiplier
7.

Hãy nhớ lại rằng chức nă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_value96.45273913513529>>> truncated_value0.239
3, 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
2.6750.26100.080.23122.145
10 đến hai thập phân. Thay vì
2.6750.26100.080.23122.145
11,
2.6750.26100.080.23122.145
12 trả về
2.6750.26100.080.23122.145
13. Nhờ các mô -đun
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08 đại diện thập phân chính xác, bạn đã giành được vấn đề này với lớp
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
07:

>>>

2.6750.26100.080.23122.145
7

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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08 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ố
101165701
45 và
2.6750.26100.080.23122.145
18:

>>>

2.6750.26100.080.23122.145
8

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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08 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ố
101165701
45 và
2.6750.26100.080.23122.145
18:

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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
91 và đặt thuộc tính
2.6750.26100.080.23122.145
20. 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ì
2.6750.26100.080.23122.145
21 trả về một đối tượng
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
92 đặ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
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08.

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

101165701
45 cộng với
2.6750.26100.080.23122.145
18 là
2.6750.26100.080.23122.145
26. 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ị
2.6750.26100.080.23122.145
26 được tự động làm tròn thành
2.6750.26100.080.23122.145
28.

Để thay đổi chiến lược làm tròn mặc định, bạn có thể đặt thuộc tính
2.6750.26100.080.23122.145
29 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
2.6750.26100.080.23122.145
30
Tập trung
2.6750.26100.080.23122.145
31
Làm tròn xuống
2.6750.26100.080.23122.145
32
Cắt ngắn
2.6750.26100.080.23122.145
33
Làm tròn từ số không
2.6750.26100.080.23122.145
34
Làm tròn một nửa so với số không
2.6750.26100.080.23122.145
35
Làm tròn một nửa về phía 0
2.6750.26100.080.23122.145
36
Làm tròn một nửa để thậm chí
2.6750.26100.080.23122.145
37

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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08 khác với những gì chúng tôi đã đồng ý trước đó trong bài viết. Ví dụ,
2.6750.26100.080.23122.145
33 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

2.6750.26100.080.23122.145
36 hoạt động, vì vậy, hãy để xem xét từng người khác trong hành động.

>>>

2.6750.26100.080.23122.145
9

Chiến lược

2.6750.26100.080.23122.145
30 hoạt động giống như hàm
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
76 mà chúng tôi đã xác định trước đó:

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

2.6750.26100.080.23122.145
30 không đối xứng xung quanh 0.

>>>

>>> def truncate(n):...  return int(n * 1000) / 1000
0

Chiến lược

2.6750.26100.080.23122.145
31 hoạt động giống như hàm
101165701
05 của chúng tôi:

Giống như

2.6750.26100.080.23122.145
30, chiến lược
2.6750.26100.080.23122.145
31 không đối xứng xung quanh 0.

>>>

>>> def truncate(n):...  return int(n * 1000) / 1000
1

Các chiến lược

2.6750.26100.080.23122.145
32 và
2.6750.26100.080.23122.145
33 có những cái tên lừa đảo có phần. Cả
2.6750.26100.080.23122.145
50 và
2.6750.26100.080.23122.145
51 đều đối xứng xung quanh 0:

Chiến lược

2.6750.26100.080.23122.145
32 làm tròn các số về 0, giống như hàm
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
11. Mặt khác,
2.6750.26100.080.23122.145
33 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
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08.

>>>

>>> def truncate(n):...  return int(n * 1000) / 1000
2

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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08 cho phép làm tròn nhiều sắc thái hơn. Phương pháp
2.6750.26100.080.23122.145
34 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:

Lưu ý rằng

2.6750.26100.080.23122.145
34 hoạt động giống như
print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
55 của chúng tôi và không thích
101165701
70.

>>>

>>> def truncate(n):...  return int(n * 1000) / 1000
3

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

2.6750.26100.080.23122.145
35 phá vỡ mối quan hệ bằng cách làm tròn về 0:

>>>

>>> def truncate(n):...  return int(n * 1000) / 1000
4

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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
08 rất khác với bất cứ điều gì chúng ta đã thấy cho đến nay:

>>>

>>> def truncate(n):...  return int(n * 1000) / 1000
5

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

2.6750.26100.080.23122.145
37 làm tròn mọi thứ về 0. Trên thực tế, đây chính xác là cách
2.6750.26100.080.23122.145
37 hoạt động, trừ khi kết quả của việc làm tròn kết thúc trong một
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
28 hoặc
101165701
63. Trong trường hợp đó, số được làm tròn khỏi số không:

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

2.6750.26100.080.23122.145
67 lần đầu tiên được làm tròn về 0 ở vị trí thập phân thứ hai, tạo ra
2.6750.26100.080.23122.145
68. Vì
2.6750.26100.080.23122.145
68 không kết thúc trong một
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
28 hoặc
101165701
63, nên nó được để lại như vậy. Mặt khác,
2.6750.26100.080.23122.145
72 được làm tròn về 0 ở vị trí thập phân thứ hai, dẫn đến số
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
01. Điều này kết thúc trong một
101165701
63, vì vậy vị trí thập phân đầu tiên sau đó được làm tròn từ số 0 đến
def truncate(n, decimals=0): multiplier = 10 ** decimals return int(n * multiplier) / multiplier
7.

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

print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
07, 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

2.6750.26100.080.23122.145
79. 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):...  return int(n * 1000) / 1000
6

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

2.6750.26100.080.23122.145
80 để 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
2.6750.26100.080.23122.145
81.

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

101165701
30, bạn có thể chuyển
101165701
30 làm đối số cho hàm
2.6750.26100.080.23122.145
84. Số lượng vị trí thập phân mong muốn được đặt với đối số từ khóa
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
56. 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
>>> 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_value96.45273913513529>>> truncated_value0.239
3 tích hợp của Python.

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

101165701
30 đến ba số thập phân:

>>>

>>> def truncate(n):...  return int(n * 1000) / 1000
7

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

2.6750.26100.080.23122.145
80 để 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
2.6750.26100.080.23122.145
81.

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

101165701
30, bạn có thể chuyển
101165701
30 làm đối số cho hàm
2.6750.26100.080.23122.145
84. Số lượng vị trí thập phân mong muốn được đặt với đối số từ khóa
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
56. 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
>>> 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_value96.45273913513529>>> truncated_value0.239
3 tích hợp của Python.

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

101165701
30 đến ba số thập phân:

  • 2.6750.26100.080.23122.145
    84 là sự thương xót của lỗi biểu diễn dấu phẩy độ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_value96.45273913513529>>> truncated_value0.239
    3 là.
  • Ví dụ: giá trị trong hàng thứ ba của cột đầu tiên trong mảng
    101165701
    30 là
    2.6750.26100.080.23122.145
    91. 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à
    2.6750.26100.080.23122.145
    92. Nhưng bạn có thể thấy trong đầu ra từ
    2.6750.26100.080.23122.145
    84 rằng giá trị được làm tròn thành
    2.6750.26100.080.23122.145
    94. Tuy nhiên, giá trị
    2.6750.26100.080.23122.145
    95 trong hàng đầu tiên của cột thứ hai chính xác là
    2.6750.26100.080.23122.145
    96.
  • 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:
  • 2.6750.26100.080.23122.145
    97

2.6750.26100.080.23122.145
98

>>>

>>> def truncate(n):...  return int(n * 1000) / 1000
8

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

2.6750.26100.080.23122.145
80 để 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
2.6750.26100.080.23122.145
81.

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

101165701
30, bạn có thể chuyển
101165701
30 làm đối số cho hàm
2.6750.26100.080.23122.145
84. Số lượng vị trí thập phân mong muốn được đặt với đối số từ khóa
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
56. 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
>>> 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_value96.45273913513529>>> truncated_value0.239
3 tích hợp của Python.

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

101165701
30 đến ba số thập phân:

2.6750.26100.080.23122.145
84 là sự thương xót của lỗi biểu diễn dấu phẩy độ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_value96.45273913513529>>> truncated_value0.239
3 là.

>>>

>>> def truncate(n):...  return int(n * 1000) / 1000
9

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

2.6750.26100.080.23122.145
80 để 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
2.6750.26100.080.23122.145
81.

>>>

>>> actual_value, truncated_value = 100, 100
0

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

2.6750.26100.080.23122.145
80 để 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
2.6750.26100.080.23122.145
81.

>>>

>>> actual_value, truncated_value = 100, 100
1

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

2.6750.26100.080.23122.145
80 để 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
2.6750.26100.080.23122.145
81.

>>> actual_value, truncated_value = 100, 100
2

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

101165701
30, bạn có thể chuyển
101165701
30 làm đối số cho hàm
2.6750.26100.080.23122.145
84. Số lượng vị trí thập phân mong muốn được đặt với đối số từ khóa
# không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))
56. 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
>>> 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_value96.45273913513529>>> truncated_value0.239
3 tích hợp của Python.

>>>

>>> actual_value, truncated_value = 100, 100
3

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

2.6750.26100.080.23122.145
80 để 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
2.6750.26100.080.23122.145
81.

Để làm tròn tất cả các giá trị trong mảng 10116570130, bạn có thể chuyển 10116570130 làm đối số cho hàm 2.6750.26100.080.23122.14584. Số lượng vị trí thập phân mong muốn được đặt với đối số từ khóa # không có tham số ndigits print(round(10))print(round(10.7))print(round(5.5))print(round(5.4))print(round(6.8))print(round(0.1))print(round(0.7))56. 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 >>> 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_value96.45273913513529>>> truncated_value0.2393 tích hợp của Python.

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

101165701
30 đến ba số thập phân:

2.6750.26100.080.23122.145
84 là sự thương xót của lỗi biểu diễn dấu phẩy độ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_value96.45273913513529>>> truncated_value0.239
3 là.

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

101165701
30 là
2.6750.26100.080.23122.145
91. 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à
2.6750.26100.080.23122.145
92. Nhưng bạn có thể thấy trong đầu ra từ
2.6750.26100.080.23122.145
84 rằng giá trị được làm tròn thành
2.6750.26100.080.23122.145
94. Tuy nhiên, giá trị
2.6750.26100.080.23122.145
95 trong hàng đầu tiên của cột thứ hai chính xác là
2.6750.26100.080.23122.145
96.

>>>

>>> actual_value, truncated_value = 100, 100
4

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

2.6750.26100.080.23122.145
80 để 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
2.6750.26100.080.23122.145
81.

>>>

>>> actual_value, truncated_value = 100, 100
5

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

2.6750.26100.080.23122.145
80 để 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
2.6750.26100.080.23122.145
81.

>>>

>>> actual_value, truncated_value = 100, 100
6

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

2.6750.26100.080.23122.145
80 để 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
2.6750.26100.080.23122.145
81.

>>>

>>> actual_value, truncated_value = 100, 100
7

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):...  return int(n * 1000) / 1000
25 độ 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!

Những tình huống như thế này cũng có thể phát sinh khi bạn chuyển đổi một loại tiền khác. Năm 1999, Ủy ban các vấn đề kinh tế và tài chính của châu Âu đã mã hóa việc sử dụng một nửa vòng tròn từ chiến lược không có tiền tệ khi chuyển đổi tiền tệ sang đồng euro, nhưng các loại tiền tệ khác có thể đã áp dụng các quy định khác nhau.

Một kịch bản khác, Vòng tròn Thụy Điển, xảy ra khi đơn vị tiền tệ tối thiểu ở cấp độ kế toán ở một quốc gia nhỏ hơn đơn vị tiền tệ vật lý thấp nhất. Ví dụ, nếu một tách cà phê có giá 2,54 đô la sau thuế, nhưng không có đồng xu 1 xu được lưu hành, bạn sẽ làm gì? Người mua đã giành chiến thắng có số tiền chính xác và người bán có thể thay đổi chính xác.

Làm thế nào các tình huống như thế này được xử lý thường được xác định bởi một chính phủ quốc gia. Bạn có thể tìm thấy một danh sách các phương pháp làm tròn được sử dụng bởi các quốc gia khác nhau trên Wikipedia.

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

    print(round(2.665, 2))print(round(50.25556, 2))print(round(100.000056, 3))print(round(80.23456, 2))print(round(122.145,5))
    08 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):...  return int(n * 1000) / 1000
    09 và
    >>> def truncate(n):...  return int(n * 1000) / 1000
    08 đố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