Hướng dẫn how do you round and divide in python? - làm thế nào để bạn làm tròn và chia trong python?

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

Show

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

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

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

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

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

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

Chức năng >>> truncate(125.6, -1) 120.0 >>> truncate(-1374.25, -3) -1000.0 3 tích hợp của Python

Python có hàm

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
3 tích hợp có hai đối số số,
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 và
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
6 và trả về số
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 được làm tròn thành
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
6. Đối số
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
6 mặc định là 0, do đó, để lại kết quả trong một số được làm tròn cho một số nguyên. Như bạn thấy,
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
3 có thể không hoạt động như bạn mong đợi.

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

Làm tròn số

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 đến
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
2 vị trí thập phân bằng cách lần đầu tiên chuyển điểm thập phân trong
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 với
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
2 vị trí bằng cách nhân
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 với 10ᵖ (10 được nâng lên công suất
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
2) để có được số mới
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
7.

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

>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
8 ở vị trí thập phân đầu tiên của
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
7. Nếu
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
8 nhỏ hơn 5, vòng
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
7 xuống số nguyên gần nhất. Nếu không, vòng
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
7 lên.

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

>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
2 vị trí bằng cách chia
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
7 cho 10ᵖ.

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

def round_up(n, decimals=0):
    multiplier = 10 ** decimals
    return math.ceil(n * multiplier) / multiplier
5 được làm tròn đến số toàn bộ gần nhất là
def round_up(n, decimals=0):
    multiplier = 10 ** decimals
    return math.ceil(n * multiplier) / multiplier
6. Số
def round_up(n, decimals=0):
    multiplier = 10 ** decimals
    return math.ceil(n * multiplier) / multiplier
7 được làm tròn đến một vị trí thập phân là
def round_up(n, decimals=0):
    multiplier = 10 ** decimals
    return math.ceil(n * multiplier) / multiplier
8.

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

def round_up(n, decimals=0):
    multiplier = 10 ** decimals
    return math.ceil(n * multiplier) / multiplier
5 đến số toàn bộ gần nhất bằng cách sử dụng chức năng
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
3 tích hợp của Python,: Chức năng:

Gasp!

Làm thế nào để

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
3 xử lý số
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
2?

Vì vậy,

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
3 vòng
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
2 lên đến
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
5 và
def round_up(n, decimals=0):
    multiplier = 10 ** decimals
    return math.ceil(n * multiplier) / multiplier
5 xuống
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
5!

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

>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
8 được cho là sẽ trả lại
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
5. Có một lý do chính đáng tại sao
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
3 hành xử theo cách nó làm.

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

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
3 hành xử theo một chiến lược làm tròn cụ thể mà có thể hoặc không phải là một trong những tình huống bạn cần cho một tình huống nhất định.

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

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

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

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

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

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

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

>>> actual_value, truncated_value = 100, 100
02 cắt ngắn một số xuống còn ba số thập phân:

>>>

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

Hàm

>>> actual_value, truncated_value = 100, 100
02 hoạt động bằng cách đầu tiên chuyển điểm thập phân trong số
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 ba vị trí bên phải bằng cách nhân
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 với
>>> actual_value, truncated_value = 100, 100
06. Phần số nguyên của số mới này được thực hiện với
>>> actual_value, truncated_value = 100, 100
07. Cuối cùng, điểm thập phân được thay đổi ba vị trí sang trái bằng cách chia
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 cho
>>> actual_value, truncated_value = 100, 100
06.

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

>>> actual_value, truncated_value = 100, 100
10:

>>>

>>> actual_value, truncated_value = 100, 100

Hàm

>>> actual_value, truncated_value = 100, 100
02 hoạt động bằng cách đầu tiên chuyển điểm thập phân trong số
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 ba vị trí bên phải bằng cách nhân
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 với
>>> actual_value, truncated_value = 100, 100
06. Phần số nguyên của số mới này được thực hiện với
>>> actual_value, truncated_value = 100, 100
07. Cuối cùng, điểm thập phân được thay đổi ba vị trí sang trái bằng cách chia
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 cho
>>> actual_value, truncated_value = 100, 100
06.

>>>

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239

Hàm

>>> actual_value, truncated_value = 100, 100
02 hoạt động bằng cách đầu tiên chuyển điểm thập phân trong số
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 ba vị trí bên phải bằng cách nhân
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 với
>>> actual_value, truncated_value = 100, 100
06. Phần số nguyên của số mới này được thực hiện với
>>> actual_value, truncated_value = 100, 100
07. Cuối cùng, điểm thập phân được thay đổi ba vị trí sang trái bằng cách chia
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 cho
>>> actual_value, truncated_value = 100, 100
06.

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

>>> actual_value, truncated_value = 100, 100
10:

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

>>> actual_value, truncated_value = 100, 100
11 và
>>> actual_value, truncated_value = 100, 100
12 với hàm
>>> actual_value, truncated_value = 100, 100
13 trong mô -đun
>>> actual_value, truncated_value = 100, 100
14, sau đó cập nhật
>>> actual_value, truncated_value = 100, 100
15 và
>>> actual_value, truncated_value = 100, 100
16:

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258

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

>>> actual_value, truncated_value = 100, 100
17, lặp qua
>>> actual_value, truncated_value = 100, 100
18 của các số trong khoảng từ
>>> actual_value, truncated_value = 100, 100
19 và
>>> actual_value, truncated_value = 100, 100
20. Giá trị được lấy từ
>>> actual_value, truncated_value = 100, 100
21 ở mỗi bước được lưu trữ trong biến
>>> actual_value, truncated_value = 100, 100
22, mà chúng tôi sử dụng ở đây vì chúng tôi không 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

>>> actual_value, truncated_value = 100, 100
11 và
>>> actual_value, truncated_value = 100, 100
12 được tạo bằng cách sử dụng
>>> actual_value, truncated_value = 100, 100
25 và được gán cho biến
>>> actual_value, truncated_value = 100, 100
26. Giá trị mới của khoản đầu tư của bạn được tính bằng cách thêm
>>> actual_value, truncated_value = 100, 100
26 vào
>>> actual_value, truncated_value = 100, 100
28 và tổng số bị cắt được tính bằng cách thêm
>>> actual_value, truncated_value = 100, 100
26 vào
>>> actual_value, truncated_value = 100, 100
30 và sau đó cắt giảm giá trị này với
>>> actual_value, truncated_value = 100, 100
02.

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

>>> actual_value, truncated_value = 100, 100
28 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
>>> actual_value, truncated_value = 100, 100
30, bạn đã nghĩ rằng bạn đã mất gần như tất cả số tiền của mình!

Bỏ qua thời điểm mà >>> truncate(125.6, -1) 120.0 >>> truncate(-1374.25, -3) -1000.0 3 không hành xử như bạn mong đợi, hãy để Lôi thử chạy lại mô phỏng. Chúng tôi sẽ sử dụng >>> truncate(125.6, -1) 120.0 >>> truncate(-1374.25, -3) -1000.0 3 lần này để làm tròn đến ba vị trí thập phân ở mỗi bước và >>> actual_value, truncated_value = 100, 100 36 Mô phỏng một lần nữa để có được kết quả tương tự như trước đây:

Thật la khac biệt!

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

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

Một người đàn ông của các phương phápCó rất nhiều chiến lược làm tròn, mỗi chiến lược đều có ưu điểm và nhược điểm. Trong phần này, bạn sẽ tìm hiểu về một số kỹ thuật phổ biến nhất và cách chúng có thể ảnh hưởng đến dữ liệu của bạn.Cắt ngắn
12.345 Phương pháp đơn giản nhất, mặc dù nhất định, để làm tròn một số là cắt số số thành một số chữ số nhất định. Khi bạn cắt một số, bạn thay thế từng chữ số sau một vị trí nhất định bằng 0. Dưới đây là một số ví dụ:10
12.345 Giá trị12
12.345 Cắt ngắn để12.3
12.345 Kết quả12.34

Hàng chục nơi

  • Những người
  • Vị trí thứ mười
  • Vị trí hàng trăm

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

>>> actual_value, truncated_value = 100, 100
02 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:

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier

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

>>> actual_value, truncated_value = 100, 100
06 để chuyển số thập phân ba vị trí sang bên phải

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

>>> actual_value, truncated_value = 100, 100
07

>>>

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62

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

>>> actual_value, truncated_value = 100, 100
06

>>>

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0

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

>>> actual_value, truncated_value = 100, 100
06 bằng số 10ᵖ (
>>> actual_value, truncated_value = 100, 100
42 đượ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 để:

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

Tập trung

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

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

Để thực hiện chiến lược làm tròn lên trên các chiến lược trong Python, chúng tôi sẽ sử dụng chức năng

>>> actual_value, truncated_value = 100, 100
48 từ mô -đun
>>> actual_value, truncated_value = 100, 100
49.

Hàm

>>> actual_value, truncated_value = 100, 100
48 có tên của nó từ thuật ngữ trần nhà, được sử dụng trong toán học để mô tả số nguyên gần nhất lớn hơn hoặc bằng một số nhất định.

Mỗi số không phải là một số nguyên nằm giữa hai số nguyên liên tiếp. Ví dụ, số

>>> actual_value, truncated_value = 100, 100
51 nằm trong khoảng thời gian giữa
>>> actual_value, truncated_value = 100, 100
52 và
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
5. Trần trần của người Viking là lớn hơn trong hai điểm cuối của khoảng thời gian. Ít hơn trong hai điểm cuối được gọi là sàn nhà. Do đó, trần của
>>> actual_value, truncated_value = 100, 100
51 là
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
5 và sàn
>>> actual_value, truncated_value = 100, 100
51 là
>>> actual_value, truncated_value = 100, 100
52.

Trong toán học, một chức năng đặc biệt gọi là hàm trần ánh xạ mỗi số lên trần nhà của nó. Để cho phép hàm trần chấp nhận số nguyên, trần của một số nguyên được xác định là chính số nguyên. Vì vậy, trần của số

>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
5 là
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
5.ceiling 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
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
5 is
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
5.

Trong Python,

>>> actual_value, truncated_value = 100, 100
60 thực hiện hàm trần và luôn trả về số nguyên gần nhất lớn hơn hoặc bằng đầu vào của nó:

>>>

>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0

Lưu ý rằng trần của

>>> actual_value, truncated_value = 100, 100
61 là
>>> actual_value, truncated_value = 100, 100
19, không phải
>>> actual_value, truncated_value = 100, 100
63. Điều này có ý nghĩa bởi vì
>>> actual_value, truncated_value = 100, 100
19 là số nguyên gần nhất đến
>>> actual_value, truncated_value = 100, 100
61 lớn hơn hoặc bằng
>>> actual_value, truncated_value = 100, 100
61.

Hãy để một chức năng viết một chức năng gọi là

>>> actual_value, truncated_value = 100, 100
67 thực hiện chiến lược làm tròn lên trên mạng:

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

Bạn có thể nhận thấy rằng

>>> actual_value, truncated_value = 100, 100
67 trông rất giống
>>> actual_value, truncated_value = 100, 100
02. Đầu tiên, điểm thập phân trong
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 được dịch chuyển đúng số vị trí bên phải bằng cách nhân
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 với
>>> actual_value, truncated_value = 100, 100
72. Giá trị mới này được làm tròn lên đến số nguyên gần nhất bằng cách sử dụng
>>> actual_value, truncated_value = 100, 100
60, và sau đó điểm thập phân được chuyển trở lại bên trái bằng cách chia cho
>>> actual_value, truncated_value = 100, 100
72.

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

Hãy cùng xem xét

>>> actual_value, truncated_value = 100, 100
67 hoạt động tốt như thế nào cho các đầu vào khác nhau:

>>>

>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55

Lưu ý rằng trần của

>>> actual_value, truncated_value = 100, 100
61 là
>>> actual_value, truncated_value = 100, 100
19, không phải
>>> actual_value, truncated_value = 100, 100
63. Điều này có ý nghĩa bởi vì
>>> actual_value, truncated_value = 100, 100
19 là số nguyên gần nhất đến
>>> actual_value, truncated_value = 100, 100
61 lớn hơn hoặc bằng
>>> actual_value, truncated_value = 100, 100
61.

>>>

>>> actual_value, truncated_value = 100, 100
0

Lưu ý rằng trần của

>>> actual_value, truncated_value = 100, 100
61 là
>>> actual_value, truncated_value = 100, 100
19, không phải
>>> actual_value, truncated_value = 100, 100
63. Điều này có ý nghĩa bởi vì
>>> actual_value, truncated_value = 100, 100
19 là số nguyên gần nhất đến
>>> actual_value, truncated_value = 100, 100
61 lớn hơn hoặc bằng
>>> actual_value, truncated_value = 100, 100
61.

Hãy để một chức năng viết một chức năng gọi là

>>> actual_value, truncated_value = 100, 100
67 thực hiện chiến lược làm tròn lên trên mạng:

>>>

>>> actual_value, truncated_value = 100, 100
1

Lưu ý rằng trần của

>>> actual_value, truncated_value = 100, 100
61 là
>>> actual_value, truncated_value = 100, 100
19, không phải
>>> actual_value, truncated_value = 100, 100
63. Điều này có ý nghĩa bởi vì
>>> actual_value, truncated_value = 100, 100
19 là số nguyên gần nhất đến
>>> actual_value, truncated_value = 100, 100
61 lớn hơn hoặc bằng
>>> actual_value, truncated_value = 100, 100
61.

Hãy để một chức năng viết một chức năng gọi là

>>> actual_value, truncated_value = 100, 100
67 thực hiện chiến lược làm tròn lên trên mạng:

Bạn có thể nhận thấy rằng

>>> actual_value, truncated_value = 100, 100
67 trông rất giống
>>> actual_value, truncated_value = 100, 100
02. Đầu tiên, điểm thập phân trong
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 được dịch chuyển đúng số vị trí bên phải bằng cách nhân
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 với
>>> actual_value, truncated_value = 100, 100
72. Giá trị mới này được làm tròn lên đến số nguyên gần nhất bằng cách sử dụng
>>> actual_value, truncated_value = 100, 100
60, và sau đó điểm thập phân được chuyển trở lại bên trái bằng cách chia cho
>>> actual_value, truncated_value = 100, 100
72.

Hướng dẫn how do you round and divide in python? - làm thế nào để bạn làm tròn và chia trong python?
Mô hình này thay đổi điểm thập phân, áp dụng một số phương pháp làm tròn để làm tròn sang số nguyên, và sau đó chuyển điểm thập phân trở lại sẽ đi lại nhiều lần khi chúng tôi điều tra các phương pháp làm tròn nhiều hơn. Rốt cuộc, đây là thuật toán tinh thần mà con người chúng ta sử dụng cho các số tròn bằng tay.

Hãy cùng xem xét

>>> actual_value, truncated_value = 100, 100
67 hoạt động tốt như thế nào cho các đầu vào khác nhau:

Giống như >>> actual_value, truncated_value = 100, 100 02, bạn có thể chuyển giá trị âm cho >>> actual_value, truncated_value = 100, 100 47:

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

>>> actual_value, truncated_value = 100, 100
47, số trong đối số đầu tiên của
>>> actual_value, truncated_value = 100, 100
67 được làm tròn đến số chữ số chính xác ở bên trái của dấu thập phân.

Giá trịHãy đoán xem những gì
>>> actual_value, truncated_value = 100, 100
80 trả về:
Kết quả
12.345 Hàng chục nơi10
12.345 Những người12
12.345 Vị trí thứ mười12.3
12.345 Vị trí hàng trăm12.34

Để thực hiện chiến lược làm tròn lên trên các chiến lược trong Python, chúng tôi sẽ sử dụng chức năng

>>> actual_value, truncated_value = 100, 100
48 từ mô -đun
>>> actual_value, truncated_value = 100, 100
49.

Hàm

>>> actual_value, truncated_value = 100, 100
48 có tên của nó từ thuật ngữ trần nhà, được sử dụng trong toán học để mô tả số nguyên gần nhất lớn hơn hoặc bằng một số nhất định.

Mỗi số không phải là một số nguyên nằm giữa hai số nguyên liên tiếp. Ví dụ, số

>>> actual_value, truncated_value = 100, 100
51 nằm trong khoảng thời gian giữa
>>> actual_value, truncated_value = 100, 100
52 và
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
5. Trần trần của người Viking là lớn hơn trong hai điểm cuối của khoảng thời gian. Ít hơn trong hai điểm cuối được gọi là sàn nhà. Do đó, trần của
>>> actual_value, truncated_value = 100, 100
51 là
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
5 và sàn
>>> actual_value, truncated_value = 100, 100
51 là
>>> actual_value, truncated_value = 100, 100
52.

>>>

>>> actual_value, truncated_value = 100, 100
2

Lưu ý rằng trần của

>>> actual_value, truncated_value = 100, 100
61 là
>>> actual_value, truncated_value = 100, 100
19, không phải
>>> actual_value, truncated_value = 100, 100
63. Điều này có ý nghĩa bởi vì
>>> actual_value, truncated_value = 100, 100
19 là số nguyên gần nhất đến
>>> actual_value, truncated_value = 100, 100
61 lớn hơn hoặc bằng
>>> actual_value, truncated_value = 100, 100
61.

>>> actual_value, truncated_value = 100, 100
3

Hãy để một chức năng viết một chức năng gọi là

>>> actual_value, truncated_value = 100, 100
67 thực hiện chiến lược làm tròn lên trên mạng:

Bạn có thể kiểm tra

>>> actual_value, truncated_value = 100, 100
96 trên một vài giá trị khác nhau:

>>>

>>> actual_value, truncated_value = 100, 100
4

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

>>> actual_value, truncated_value = 100, 100
67 và
>>> actual_value, truncated_value = 100, 100
96 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:

>>> actual_value, truncated_value = 100, 100
02,
>>> actual_value, truncated_value = 100, 100
67 và
>>> actual_value, truncated_value = 100, 100
96. 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

>>> actual_value, truncated_value = 100, 100
02 và
>>> actual_value, truncated_value = 100, 100
67 và
>>> actual_value, truncated_value = 100, 100
96 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.

Hãy nhớ lại rằng

>>> actual_value, truncated_value = 100, 100
67 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ụ,
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
10 trả về
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
5, nhưng
>>> actual_value, truncated_value = 100, 100
80 trả về
>>> actual_value, truncated_value = 100, 100
63. Hàm
>>> actual_value, truncated_value = 100, 100
96 cũng không đối xứng khoảng 0.

Mặt khác, hàm

>>> actual_value, truncated_value = 100, 100
02 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,
>>> actual_value, truncated_value = 100, 100
02 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,
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
17 trả về
>>> actual_value, truncated_value = 100, 100
52 và
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
19 trả về
>>> actual_value, truncated_value = 100, 100
63.

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.rounding bias, which describes how rounding affects numeric data in a dataset.

Chiến lược làm tròn của người Viking có một vòng hướng tới sự thiên vị vô cực tích cực, bởi vì giá trị luôn được làm tròn theo hướng vô cực tích cực. Tương tự như vậy, chiến lược làm tròn xuống của người Viking có một vòng đối với sự thiên vị vô cực tiêu cực.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.

Chiến lược cắt ngắn của người Viking thể hiện một vòng hướng tới sự thiên vị vô cực tiêu cực đối với các giá trị dương và một vòng hướng tới vô cực dương cho các giá trị âm. Các chức năng làm tròn với hành vi này được cho là có một vòng về phía không thiên vị, nói chung.round towards zero bias, in general.

Hãy để xem cách thức hoạt động của nó trong thực tế. Hãy xem xét danh sách các phao sau:

>>>

>>> actual_value, truncated_value = 100, 100
5

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
21 bằng cách sử dụng hàm
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
22:

>>>

>>> actual_value, truncated_value = 100, 100
6

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

>>> actual_value, truncated_value = 100, 100
67,
>>> actual_value, truncated_value = 100, 100
96 và
>>> actual_value, truncated_value = 100, 100
02 trong danh sách hiểu để làm tròn từng số trong
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
21 đến một vị trí thập phân và tính giá trị trung bình mới:

>>>

>>> actual_value, truncated_value = 100, 100
7

Sau khi mỗi số trong

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
21 được làm tròn, giá trị trung bình mới là khoảng
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
28, lớn hơn giá trị trung bình thực tế của khoảng
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
29. Làm tròn xuống dịch chuyển trung bình xuống khoảng
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
30. Giá trị trung bình của các giá trị bị cắt là khoảng
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
31 và là giá trị gần nhất với giá trị trung bình thực tế.

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
21 chứa số lượng giá trị dương và âm bằng nhau. Hàm
>>> actual_value, truncated_value = 100, 100
02 sẽ hoạt động giống như
>>> actual_value, truncated_value = 100, 100
67 trên danh sách tất cả các giá trị dương và giống như
>>> actual_value, truncated_value = 100, 100
96 trên danh sách tất cả các giá trị âm.

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

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

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
36 và
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
37 đến một vị trí thập phân, có lẽ bạn sẽ phản hồi nhanh chóng với
>>> actual_value, truncated_value = 100, 100
51 và
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
39. Các chức năng
>>> actual_value, truncated_value = 100, 100
02,
>>> actual_value, truncated_value = 100, 100
67 và
>>> actual_value, truncated_value = 100, 100
96 don don làm bất cứ điều gì như thế này.

Còn số

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
43 thì sao? Bạn có thể nghĩ ngay lập tức để làm tròn điều này đến
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
39, nhưng trong thực tế,
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
43 là tương đương từ
>>> actual_value, truncated_value = 100, 100
51 và
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
39. Theo một nghĩa nào đó,
>>> actual_value, truncated_value = 100, 100
51 và
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
39 đều là những con số gần nhất đến
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
43 với độ chính xác của số thập phân. Số
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
43 được gọi là cà vạt liên quan đến
>>> actual_value, truncated_value = 100, 100
51 và
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
39. 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
>>> actual_value, truncated_value = 100, 100
51 and
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
39. In cases like this, you must assign a tiebreaker.

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

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

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

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

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
54.

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
55 vào giá trị đã thay đổi và sau đó làm tròn với
>>> actual_value, truncated_value = 100, 100
99. Đ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

    >>> import random
    >>> random.seed(100)
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate(truncated_value + randn)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    55 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

    >>> import random
    >>> random.seed(100)
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate(truncated_value + randn)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    54, thì việc thêm
    >>> import random
    >>> random.seed(100)
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate(truncated_value + randn)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    55 sẽ tăng phần số nguyên của giá trị dịch chuyển bằng
    >>> actual_value, truncated_value = 100, 100
    
    52, do đó sàn bằng số nguyên lớn hơn này.

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

>>> actual_value, truncated_value = 100, 100
8

Lưu ý rằng

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 trông rất giống
>>> actual_value, truncated_value = 100, 100
96. Điều này có thể có phần phản trực giác, nhưng bên trong
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 chỉ làm tròn. Bí quyết là thêm
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
55 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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

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

>>>

>>> actual_value, truncated_value = 100, 100
9

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 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ư
>>> actual_value, truncated_value = 100, 100
88 tròn đến
>>> actual_value, truncated_value = 100, 100
63, không phải là
>>> actual_value, truncated_value = 100, 100
89:

>>>

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
0

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 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ư
>>> actual_value, truncated_value = 100, 100
88 tròn đến
>>> actual_value, truncated_value = 100, 100
63, không phải là
>>> actual_value, truncated_value = 100, 100
89:

>>>

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
1

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 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ư
>>> actual_value, truncated_value = 100, 100
88 tròn đến
>>> actual_value, truncated_value = 100, 100
63, không phải là
>>> actual_value, truncated_value = 100, 100
89:

>>>

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
2

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 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ư
>>> actual_value, truncated_value = 100, 100
88 tròn đến
>>> actual_value, truncated_value = 100, 100
63, không phải là
>>> actual_value, truncated_value = 100, 100
89:

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

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
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ôi xem những gì xảy ra khi bạn cố gắng và làm tròn

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
71 đến
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
5 Số thập phân:

>>>

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
3

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 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ư
>>> actual_value, truncated_value = 100, 100
88 tròn đến
>>> actual_value, truncated_value = 100, 100
63, không phải là
>>> actual_value, truncated_value = 100, 100
89:

>>>

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
4

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 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ư
>>> actual_value, truncated_value = 100, 100
88 tròn đến
>>> actual_value, truncated_value = 100, 100
63, không phải là
>>> actual_value, truncated_value = 100, 100
89:

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

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
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ôi xem những gì xảy ra khi bạn cố gắng và làm tròn

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
71 đến
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
5 Số thập phân:

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
71 bị đập vào giữa
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
74 và
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
75. Vì
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
74 là lớn hơn của hai người này,
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
77 sẽ trả lại
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
74. Nhưng thay vào đó, chúng tôi có
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
75.should not be used in situations where precision is paramount. For applications where the exact precision is necessary, you can use the
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
98 class from Python’s
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
99 module. You’ll learn more about the
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
98 class below.

Có lỗi trong hàm

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 không?

Khi

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 vòng
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
71 đến hai vị trí thập phân, điều đầu tiên nó làm là 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_value
96.45273913513529

>>> truncated_value
0.239
71 với
>>> actual_value, truncated_value = 100, 100
10. Hãy để đảm bảo rằng điều này hoạt động như mong đợi:

Vâng, đó là sai! Nhưng nó giải thích tại sao >>> import random >>> random.seed(100) >>> for _ in range(1000000): ... randn = random.uniform(-0.05, 0.05) ... actual_value = actual_value + randn ... truncated_value = truncate(truncated_value + randn) ... >>> actual_value 96.45273913513529 >>> truncated_value 0.239 77 trả về -1,23. Hãy để tiếp tục các bước từng bước >>> import random >>> random.seed(100) >>> for _ in range(1000000): ... randn = random.uniform(-0.05, 0.05) ... actual_value = actual_value + randn ... truncated_value = truncate(truncated_value + randn) ... >>> actual_value 96.45273913513529 >>> truncated_value 0.239 61, sử dụng >>> actual_value, truncated_value = 100, 100 22 trong bản phát hành để nhớ lại đầu ra giá trị cuối cùng ở mỗi bước:

Mặc dù

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
88 thực sự gần với
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
89, số nguyên gần nhất nhỏ hơn hoặc bằng với nó là
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
90. Khi điểm thập phân được chuyển trở lại bên trái, giá trị cuối cùng là
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
75.

Chà, bây giờ bạn biết làm thế nào
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
77 trả về
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
75 mặc dù không có lỗi logic, nhưng tại sao Python nói rằng
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
94 là
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
95? Có lỗi trong Python không?
Thực tế là Python nói rằng
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
94 là
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
95 là một tạo tác của lỗi biểu diễn điểm nổi. Bạn có thể tự hỏi mình, được rồi, nhưng có cách nào để khắc phục điều này không? Một câu hỏi hay hơn để tự hỏi mình là "Tôi có cần sửa cái này không?"
Các số điểm nổi không có độ chính xác chính xác, và do đó không nên được sử dụng trong các tình huống trong đó độ chính xác là tối quan trọng. Đối với các ứng dụng có độ chính xác chính xác là cần thiết, bạn có thể sử dụng lớp
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
98 từ mô -đun Python, ____299. Bạn sẽ tìm hiểu thêm về lớp
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
98 dưới đây.
13.825 Hàng chục nơi10
13.825 Những người14
13.825 Vị trí thứ mười13.8
13.825 Vị trí hàng trăm13.82

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
54.

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
5

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

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

>>>

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
6

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 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ư
>>> actual_value, truncated_value = 100, 100
88 tròn đến
>>> actual_value, truncated_value = 100, 100
63, không phải là
>>> actual_value, truncated_value = 100, 100
89:

>>>

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
7

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

>>>

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
8

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 và
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
07:

>>>

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
9

Mỗi số trong

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
21 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
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 giới thiệu một vòng hướng tới sai lệch vô cực dương và
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

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

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

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

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 và
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

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

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
0

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

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

Để thực hiện một nửa vòng tròn từ chiến lược số 0 trên một số

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5, bạn bắt đầu như bình thường bằng cách chuyển điểm thập phân sang đúng một số vị trí nhất định. Sau đó, bạn nhìn vào chữ số
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
8 ngay bên phải vị trí thập phân trong số mới này. Tại thời điểm này, có bốn trường hợp cần xem xét:

  1. Nếu
    >>> truncate(125.6, -1)
    120.0
    
    >>> truncate(-1374.25, -3)
    -1000.0
    
    5 là tích cực và
    >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    20, hãy làm tròn
  2. Nếu
    >>> truncate(125.6, -1)
    120.0
    
    >>> truncate(-1374.25, -3)
    -1000.0
    
    5 là dương và
    >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    22, hãy làm tròn xuống
  3. Nếu
    >>> truncate(125.6, -1)
    120.0
    
    >>> truncate(-1374.25, -3)
    -1000.0
    
    5 là âm và
    >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    20, hãy làm tròn xuống
  4. Nếu
    >>> truncate(125.6, -1)
    120.0
    
    >>> truncate(-1374.25, -3)
    -1000.0
    
    5 là âm và
    >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    22, hãy làm tròn

Sau khi làm tròn theo một trong bốn quy tắc trên, sau đó bạn chuyển vị trí thập phân trở lại bên trái.

Với một số

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 và giá trị cho
>>> actual_value, truncated_value = 100, 100
47, bạn có thể thực hiện điều này trong Python bằng cách sử dụng
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 và
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
07:

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
1

Điều đó đủ dễ dàng, nhưng thực sự có một cách đơn giản hơn!

Nếu trước tiên bạn lấy giá trị tuyệt đối của

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 bằng cách sử dụng hàm
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
32 tích hợp của Python, bạn chỉ có thể sử dụng
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 để làm tròn số. Sau đó, tất cả những gì bạn cần làm là cho số tròn giống như
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5. Một cách để làm điều này là sử dụng hàm
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
35.

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
35 lấy hai số
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
37 và
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
38 và trả về
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
37 với dấu hiệu
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
38:

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
2

Lưu ý rằng

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
35 trả về
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

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

Sử dụng

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
32,
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 và
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

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

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
3

Trong

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
46, giá trị tuyệt đối của
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 được làm tròn đến
>>> actual_value, truncated_value = 100, 100
47 vị trí thập phân bằng cách sử dụng
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 và kết quả này được gán cho biến
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
50. Sau đó, dấu hiệu ban đầu của
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 được áp dụng cho
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
50 bằng cách sử dụng
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

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

Kiểm tra

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

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

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
4

Hàm

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
46 làm tròn số theo cách mà hầu hết mọi người có xu hướng tròn số trong cuộc sống hàng ngày. Bên cạnh đó là chức năng làm tròn quen thuộc nhất mà bạn đã thấy cho đến nay,
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

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

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

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

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

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
5

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
21 được bảo tồn gần như chính xác khi bạn làm tròn từng số trong
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
21 đến một vị trí thập phân với
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
46!

Tuy nhiên,

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

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

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

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
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 từ số không đếnKết quả
15.255 Hàng chục nơi20
15.255 Những người15
15.255 Vị trí thứ mười15.3
15.255 Để thực hiện một nửa vòng tròn từ chiến lược số 0 trên một số
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5, bạn bắt đầu như bình thường bằng cách chuyển điểm thập phân sang đúng một số vị trí nhất định. Sau đó, bạn nhìn vào chữ số
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
8 ngay bên phải vị trí thập phân trong số mới này. Tại thời điểm này, có bốn trường hợp cần xem xét:
15.26

Nếu

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
5 là tích cực và
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
20, hãy làm tròn

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

>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
8 trả về
>>> round_up(1.1)
2.0

>>> round_up(1.23, 1)
1.3

>>> round_up(1.543, 2)
1.55
5. Nó không phải là một sai lầm. Đó là một quyết định thiết kế có ý thức dựa trên các khuyến nghị vững chắc.

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

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
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:

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
6

Hàm

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
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,

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
3 bị trục trặc tương tự mà bạn đã thấy trong
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 nhờ lỗi biểu diễn điểm nổi:

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
7

Hàm

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
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,

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
3 bị trục trặc tương tự mà bạn đã thấy trong
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 nhờ lỗi biểu diễn điểm nổi:

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

Lớp

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
98

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
99 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):
    >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    74 is actually
    >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    74, and
    >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    76 returns
    >>> actual_value, truncated_value = 100, 100
    
    19, as you’d expect.
  • Những lợi ích của mô -đun
    >>> import random
    >>> random.seed(100)
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate(truncated_value + randn)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    99 bao gồm:
    : When you add
    >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    78 and
    >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    79, the result is
    >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    80 with the trailing zero maintained to indicate significance.
  • Đại diện thập phân chính xác:
    >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    74 thực sự là
    >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    74 và
    >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    76 trả về
    >>> actual_value, truncated_value = 100, 100
    
    19, như bạn mong đợi.
    : The default precision of the
    >>> import random
    >>> random.seed(100)
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate(truncated_value + randn)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    99 module is twenty-eight digits, but this value can be altered by the user to match the problem at hand.

Bảo tồn các chữ số quan trọng: Khi bạn thêm

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
78 và
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
79, kết quả là
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
80 với số 0 được duy trì để chỉ ra ý nghĩa.

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
8

Hàm

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
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,

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
3 bị trục trặc tương tự mà bạn đã thấy trong
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 nhờ lỗi biểu diễn điểm nổi:

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.

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
9

Hàm

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
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.

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
0

Cuối cùng,

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
3 bị trục trặc tương tự mà bạn đã thấy trong
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61 nhờ lỗi biểu diễn điểm nổi:

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.

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
1

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

Lớp

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
98

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
2

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

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

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
3

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

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
99 bao gồm:

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
21 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
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
22
Tập trung
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
23
Làm tròn xuống
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
24
Cắt ngắn
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
25
Làm tròn từ số không
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
26
Làm tròn một nửa so với số không
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
27
Làm tròn một nửa về phía 0
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
28
Làm tròn một nửa để thậm chí
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
29
Làm tròn và làm tròn về phía 0

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
99 khác với những gì chúng tôi đã đồng ý trước đó trong bài viết. Ví dụ,
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
25 thực hiện các vòng tròn từ chiến lược không có, thực sự làm tròn các số âm.

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
28, vì vậy, hãy để xem xét từng người khác trong hành động.

Chiến lược

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
22 hoạt động giống như hàm
>>> actual_value, truncated_value = 100, 100
67 mà chúng tôi đã xác định trước đó:

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
4

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
22 không đối xứng xung quanh 0.

Chiến lược

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
23 hoạt động giống như hàm
>>> actual_value, truncated_value = 100, 100
96 của chúng tôi:

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
5

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
22 không đối xứng xung quanh 0.

Chiến lược

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
23 hoạt động giống như hàm
>>> actual_value, truncated_value = 100, 100
96 của chúng tôi:

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
6

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
22 không đối xứng xung quanh 0.

Chiến lược

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
23 hoạt động giống như hàm
>>> actual_value, truncated_value = 100, 100
96 của chúng tôi:

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
7

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
22 không đối xứng xung quanh 0.

Chiến lược

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
23 hoạt động giống như hàm
>>> actual_value, truncated_value = 100, 100
96 của chúng tôi:

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
8

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
22 không đối xứng xung quanh 0.

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
9

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
22 không đối xứng xung quanh 0.

>>>

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
0

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
22 không đối xứng xung quanh 0.

Chiến lược

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
23 hoạt động giống như hàm
>>> actual_value, truncated_value = 100, 100
96 của chúng tôi:

Giống như

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
22, chiến lược
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
23 không đối xứng xung quanh 0.

Các chiến lược

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
24 và
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
25 có những cái tên lừa đảo có phần. Cả
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
42 và
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
43 đều đối xứng xung quanh 0:

Chiến lược def truncate(n, decimals=0): multiplier = 10 ** decimals return int(n * multiplier) / multiplier 24 làm tròn các số về 0, giống như hàm >>> actual_value, truncated_value = 100, 100 02. Mặt khác, def truncate(n, decimals=0): multiplier = 10 ** decimals return int(n * multiplier) / multiplier 25 làm tròn mọi thứ từ số không. Đây là một sự phá vỡ rõ ràng từ thuật ngữ mà chúng tôi đã đồng ý trước đó trong bài viết, vì vậy hãy ghi nhớ điều đó khi bạn đang làm việc với mô -đun >>> import random >>> random.seed(100) >>> for _ in range(1000000): ... randn = random.uniform(-0.05, 0.05) ... actual_value = actual_value + randn ... truncated_value = truncate(truncated_value + randn) ... >>> actual_value 96.45273913513529 >>> truncated_value 0.239 99.

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

>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
99 cho phép làm tròn nhiều sắc thái hơn. Phương pháp
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
26 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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
26 hoạt động giống như
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

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

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
46 của chúng tôi và không thích
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61.

>>>

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
1

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
22 không đối xứng xung quanh 0.

Chiến lược

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
23 hoạt động giống như hàm
>>> actual_value, truncated_value = 100, 100
96 của chúng tôi:

Giống như

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
22, chiến lược
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
23 không đối xứng xung quanh 0.

>>>

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
2

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
22 không đối xứng xung quanh 0.

Chiến lược

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
23 hoạt động giống như hàm
>>> actual_value, truncated_value = 100, 100
96 của chúng tôi:

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:

  • def truncate(n, decimals=0):
        multiplier = 10 ** decimals
        return int(n * multiplier) / multiplier
    
    89
  • def truncate(n, decimals=0):
        multiplier = 10 ** decimals
        return int(n * multiplier) / multiplier
    
    90
  • def truncate(n, decimals=0):
        multiplier = 10 ** decimals
        return int(n * multiplier) / multiplier
    
    91
  • def truncate(n, decimals=0):
        multiplier = 10 ** decimals
        return int(n * multiplier) / multiplier
    
    92

Hàm

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
93 làm tròn mọi giá trị trong mảng đến số nguyên gần nhất lớn hơn hoặc bằng giá trị ban đầu:

>>>

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
3

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

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

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
94, cho một giá trị âm được làm tròn về 0. Ký hiệu này có thể hữu ích khi một dấu hiệu tiêu cực là đáng kể; Ví dụ, khi lập bảng nhiệt độ Celsius, trong đó một dấu hiệu tiêu cực có nghĩa là dưới mức đóng băng. (Nguồn)

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
95:

>>>

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
4

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

>>>

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
5

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

>>>

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
6

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

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
7

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

>>>

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
8

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

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

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
94, cho một giá trị âm được làm tròn về 0. Ký hiệu này có thể hữu ích khi một dấu hiệu tiêu cực là đáng kể; Ví dụ, khi lập bảng nhiệt độ Celsius, trong đó một dấu hiệu tiêu cực có nghĩa là dưới mức đóng băng. (Nguồn)

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
95:

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
96:

>>>

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
9

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

>>>

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
0

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

>>>

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
1

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
94, cho một giá trị âm được làm tròn về 0. Ký hiệu này có thể hữu ích khi một dấu hiệu tiêu cực là đáng kể; Ví dụ, khi lập bảng nhiệt độ Celsius, trong đó một dấu hiệu tiêu cực có nghĩa là dưới mức đóng băng. (Nguồn)

>>>

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
2

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
95:

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
96:

Cuối cùng, để làm tròn đến số nguyên gần nhất bằng cách sử dụng một nửa làm tròn cho chiến lược thậm chí là sử dụng def truncate(n, decimals=0): multiplier = 10 ** decimals return int(n * multiplier) / multiplier 97:

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

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
98 là tất cả những gì bạn cần. Nếu bạn cần thực hiện một chiến lược khác, chẳng hạn như
>>> import random
>>> random.seed(100)

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

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
61, bạn có thể làm như vậy với một sửa đổi đơn giản:

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

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

Làm tròn Pandas

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
00 và
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
01

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

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

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

    >>> import random
    >>> random.seed(100)
    
    >>> for _ in range(1000000):
    ...     randn = random.uniform(-0.05, 0.05)
    ...     actual_value = actual_value + randn
    ...     truncated_value = truncate(truncated_value + randn)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> truncated_value
    0.239
    
    99 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

    >>> truncate(12.5)
    12.0
    
    >>> truncate(-5.963, 1)
    -5.9
    
    >>> truncate(1.625, 2)
    1.62
    
    00 và
    >>> truncate(12.5)
    12.0
    
    >>> truncate(-5.963, 1)
    -5.9
    
    >>> truncate(1.625, 2)
    1.62
    
    01 đố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

Làm thế nào để bạn viết làm tròn trong Python?

Python có hàm vòng () tích hợp có hai đối số số, n và ndigits và trả về số N được làm tròn cho ndigits. Đối số NDigits mặc định là 0, do đó, để lại kết quả trong một số được làm tròn cho một số nguyên. . The ndigits argument defaults to zero, so leaving it out results in a number rounded to an integer.

Làm thế nào để bạn chia tới 2 vị trí thập phân ở Python?

Hàm vòng () của Python yêu cầu hai đối số.Đầu tiên là số được làm tròn.Đối số thứ hai quyết định số lượng vị trí thập phân mà nó được làm tròn.Để làm tròn số đến 2 số thập phân, đưa ra đối số thứ hai là 2.give second argument as 2.

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

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

Vòng 0,5 trong Python là gì?

Python: Round () Chức năng Lưu ý: Đối với các loại tích hợp hỗ trợ vòng (), các giá trị được làm tròn đến bội số gần nhất của 10 với Power Minus NDigits;Nếu hai bội số gần nhau, làm tròn được thực hiện theo lựa chọn chẵn (ví dụ, cả hai vòng (0,5) và tròn (-0,5) là 0 và vòng (1.5) là 2).round(0.5) and round(-0.5) are 0, and round(1.5) is 2).