Loại
deposit = Decimal['0.93']
decimal_future_value = deposit * [1 + [Decimal['0.0225']]]**Decimal['1000']
decimal_future_value
>>> Decimal['4283508449.711328779924154334']
0 của Python là bước đầu tiên tự nhiên để biểu thị số tiền trong mã. Hầu như tất cả các nền tảng ánh xạ Python đều có độ chính xác kép của IEEE-754Nhân đôi chứa 53 bit chính xác. Khi máy đang cố gắng biểu diễn phần phân số [phần định trị] của một số đã cho, nó sẽ tìm thấy một chuỗi bit
deposit = Decimal['0.93']
decimal_future_value = deposit * [1 + [Decimal['0.0225']]]**Decimal['1000']
decimal_future_value
>>> Decimal['4283508449.711328779924154334']
1 sao cho tổng$$ b_1[\frac{1}{2}]^{1} + b_2[\frac{1}{2}]^{2} +. + b_{53}[\frac{1}{2}]^{53} $$
càng gần số càng tốt. Vì vậy, các giá trị như 0. 1 không thể được đại diện chính xác. Bạn có thể tìm thấy ví dụ nổi tiếng này trong các tài liệu Python chính thức
Nó xảy ra bởi vì 0. 1 không chính xác là 1/10
Hãy xem nó có thể cản trở hoạt động tiền tệ như thế nào
Một cửa hàng web bán một mặt hàng với giá 1. 01. Cửa hàng web mua nó từ nhà cung cấp của nó với giá 0. 99 và chủ sở hữu muốn tính doanh thu nếu hàng triệu mặt hàng [một mặt hàng có 18 số 0] được bán
format[[1.01 - 0.99]*1e18, '.2f']
>>> '20000000000000016.00'
Bạn đã mong đợi số 2 với 16 số không [2 xu doanh thu trên mỗi mặt hàng nhân với 1e18], nhưng có thêm 16 đô la. Sẽ mất rất nhiều thời gian để bán được nhiều mặt hàng như vậy, nhưng dù sao tính toán cũng sai
Ví dụ thực tế hơn
Bạn có một khoản tiền gửi 93 xu trong một ngân hàng với 2. lãi suất 25%. Bạn đã trở lại trong một ngàn năm để rút nó. Đã xảy ra với anh chàng này
Đối với điều đó, bạn cần phải tính toán một giá trị trong tương lai
deposit = 0.93
future_value = deposit * [[1 + [0.0225]]**1000]
future_value
>>> 4283508449.7111807
gần 4. 3 tỷ. Nhưng nó có chính xác không vì chúng ta đang sử dụng float ở đây?
Số thập phân
Nó là một phần của thư viện chuẩn và cung cấp biểu diễn các số thực. Tính toán doanh thu của cửa hàng trực tuyến hiện đã chính xác
from decimal import Decimal
sell_price = Decimal['1.01']
buy_price = Decimal['0.99']
items_sold = Decimal['1e18']
profit = [sell_price - buy_price] * items_sold
profit
>>> Decimal['2E+16']
Và cho giá trị tương lai
deposit = Decimal['0.93']
decimal_future_value = deposit * [1 + [Decimal['0.0225']]]**Decimal['1000']
decimal_future_value
>>> Decimal['4283508449.711328779924154334']
Sự khác biệt với float trong trường hợp đó là khá nhỏ - chữ số thứ 4 sau dấu thập phân. Nhưng nó vẫn hiện diện
Hiệu suất
Float cũng xuất hiện nhanh hơn Decimal
In [2]: def float_order[item_price, item_count]:
...: return sum[[item_price for _ in range[item_count]]]
...:
In [3]: def decimal_order[item_price, item_count]:
...: decimal_item_price = Decimal[item_price]
...: return sum[[decimal_item_price for _ in range[item_count]]]
...:
In [4]: %timeit float_order[1.01, 10000]
297 µs ± 11.6 µs per loop [mean ± std. dev. of 7 runs, 1000 loops each]
In [5]: from decimal import Decimal
In [6]: %timeit decimal_order['1.01', 10000]
783 µs ± 19.7 µs per loop [mean ± std. dev. of 7 runs, 1000 loops each]
Bạn đã bao giờ gặp vấn đề khi làm việc với các giá trị tiền tệ được đại diện bởi
deposit = Decimal['0.93']
decimal_future_value = deposit * [1 + [Decimal['0.0225']]]**Decimal['1000']
decimal_future_value
>>> Decimal['4283508449.711328779924154334']
0 chưa? Phải định dạng thủ công một số dưới dạng chuỗi tiền tệ có thể là một quá trình tẻ nhạt. Bạn có thể chỉ cần thực hiện một vài dòng sửa đổi, tuy nhiên, khi chúng tôi cần thực hiện một số chuyển đổi hợp lý, nó sẽ trở nên rất tẻ nhạt
Bước đầu tiên để tự động hóa các loại nhiệm vụ này sẽ yêu cầu một chức năng. Trong bài viết này, chúng ta sẽ xem xét một số phương pháp bạn có thể sử dụng để định dạng số dưới dạng chuỗi tiền tệ trong Python
Phương pháp định dạng số
Chúng ta sẽ xem qua ba thư viện và hàm thay thế cho phép chúng ta chuyển đổi số thành chuỗi tiền tệ
- Mô-đun bản địa
- mô-đun Babel
- Hàm
1en_GB af_ZA sq_AL gsw_FR am_ET ar_SA ar_IQ ar_EG ar_LY ar_DZ ...
Tuy nhiên, mô-đun
en_GB
af_ZA
sq_AL
gsw_FR
am_ET
ar_SA
ar_IQ
ar_EG
ar_LY
ar_DZ
...
2 đã được bao gồm trong Python, chúng tôi sẽ phải cài đặt Babel để sử dụng nóĐịnh dạng số dưới dạng chuỗi tiền tệ với ngôn ngữ
Mô-đun
en_GB
af_ZA
sq_AL
gsw_FR
am_ET
ar_SA
ar_IQ
ar_EG
ar_LY
ar_DZ
...
2 đã được cài đặt sẵn với phiên bản Python của bạnGói này cho phép các nhà phát triển bản địa hóa các ứng dụng của họ. Có nghĩa là họ không cần biết phần mềm của họ sẽ chạy ở khu vực nào, họ chỉ cần viết một cơ sở mã chung sẽ tự động thay đổi tùy thuộc vào khu vực sử dụng
Đang khởi tạo miền địa phương
Để bắt đầu sử dụng mô-đun
en_GB
af_ZA
sq_AL
gsw_FR
am_ET
ar_SA
ar_IQ
ar_EG
ar_LY
ar_DZ
...
2, trước tiên bạn cần đặt ngôn ngữĐoạn mã trên sẽ tạo ra đầu ra sau
English_United States.1252
en_GB
Để có danh sách các ngôn ngữ khả dụng, bạn có thể tra cứu nó trên MS-LCID. Ngoài ra, bạn có thể in nó ra
Chạy bất kỳ biến thể nào ở trên sẽ mang lại kết quả tương tự như
en_GB
af_ZA
sq_AL
gsw_FR
am_ET
ar_SA
ar_IQ
ar_EG
ar_LY
ar_DZ
...
Định dạng số bằng ngôn ngữ
Với bộ ngôn ngữ ưa thích của bạn, bạn có thể dễ dàng định dạng chuỗi số
Chạy đoạn mã trên, chúng tôi nhận được đầu ra sau
deposit = 0.93
future_value = deposit * [[1 + [0.0225]]**1000]
future_value
>>> 4283508449.7111807
1Sử dụng str. phương thức định dạng[]
Phương pháp tiếp theo chúng ta sẽ đề cập là phương pháp
en_GB
af_ZA
sq_AL
gsw_FR
am_ET
ar_SA
ar_IQ
ar_EG
ar_LY
ar_DZ
...
1, phương pháp này có ưu điểm là phương pháp đơn giản nhấtChạy đoạn mã trên, chúng tôi nhận được đầu ra sau
deposit = 0.93
future_value = deposit * [[1 + [0.0225]]**1000]
future_value
>>> 4283508449.7111807
3Mặc dù vậy, cách tiếp cận này được mã hóa cứng, không giống như cách trước đó, bạn có thể sử dụng cách này để bản địa hóa định dạng một cách linh hoạt
Định dạng số dưới dạng chuỗi tiền tệ với Babel
Sử dụng Babel có lẽ là một trong những phương pháp ít được biết đến hơn, tuy nhiên nó rất thân thiện và trực quan. Nó đi kèm với định dạng số và tiền tệ cũng như các tác vụ quốc tế hóa khác
Không giống như mô-đun
en_GB
af_ZA
sq_AL
gsw_FR
am_ET
ar_SA
ar_IQ
ar_EG
ar_LY
ar_DZ
...
2 của Python, bạn không phải lo lắng về việc điều chỉnh trên quy mô toàn cầuĐể cài đặt
en_GB
af_ZA
sq_AL
gsw_FR
am_ET
ar_SA
ar_IQ
ar_EG
ar_LY
ar_DZ
...
7 qua en_GB
af_ZA
sq_AL
gsw_FR
am_ET
ar_SA
ar_IQ
ar_EG
ar_LY
ar_DZ
...
8, hãy chạy lệnh sauHãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó
deposit = 0.93
future_value = deposit * [[1 + [0.0225]]**1000]
future_value
>>> 4283508449.7111807
7Sau khi cài đặt, để đạt được kết quả tương tự như hai phương pháp khác được liệt kê ở trên, bạn chỉ cần gọi
en_GB
af_ZA
sq_AL
gsw_FR
am_ET
ar_SA
ar_IQ
ar_EG
ar_LY
ar_DZ
...
9 trên một chuỗiChạy đoạn mã trên, chúng tôi nhận được đầu ra sau
deposit = 0.93
future_value = deposit * [[1 + [0.0225]]**1000]
future_value
>>> 4283508449.7111807
9Để có được danh sách đầy đủ các ngôn ngữ có sẵn
from decimal import Decimal
sell_price = Decimal['1.01']
buy_price = Decimal['0.99']
items_sold = Decimal['1e18']
profit = [sell_price - buy_price] * items_sold
profit
>>> Decimal['2E+16']
0Trông giống như thế này
from decimal import Decimal
sell_price = Decimal['1.01']
buy_price = Decimal['0.99']
items_sold = Decimal['1e18']
profit = [sell_price - buy_price] * items_sold
profit
>>> Decimal['2E+16']
1Tìm kiếm các số trong chuỗi và định dạng dưới dạng tiền tệ
Đôi khi, bạn không làm việc với đầu vào số trực tiếp, chẳng hạn như đầu vào từ người dùng. Bạn có thể đang làm việc với một câu hoặc một kho văn bản lớn hơn, ô uế. Chúng ta có thể sử dụng mô-đun
deposit = 0.93
future_value = deposit * [[1 + [0.0225]]**1000]
future_value
>>> 4283508449.7111807
10 để lọc qua các loại đầu vào khác nhau, tìm các giá trị số và định dạng chúngHãy sử dụng cả ba cách tiếp cận trên để định dạng đơn vị tiền tệ trong câu
from decimal import Decimal
sell_price = Decimal['1.01']
buy_price = Decimal['0.99']
items_sold = Decimal['1e18']
profit = [sell_price - buy_price] * items_sold
profit
>>> Decimal['2E+16']
3Tiếp theo, chúng tôi đưa ra mẫu regex cần thiết để khớp với các chuỗi số
Tiếp theo, chúng ta áp dụng ba phương thức đã học cho biến chuỗi
deposit = 0.93
future_value = deposit * [[1 + [0.0225]]**1000]
future_value
>>> 4283508449.7111807
11Hãy so sánh đầu ra ban đầu với đầu ra nhận được từ cả ba phương pháp
from decimal import Decimal
sell_price = Decimal['1.01']
buy_price = Decimal['0.99']
items_sold = Decimal['1e18']
profit = [sell_price - buy_price] * items_sold
profit
>>> Decimal['2E+16']
5en_GB
af_ZA
sq_AL
gsw_FR
am_ET
ar_SA
ar_IQ
ar_EG
ar_LY
ar_DZ
...
0Tùy thuộc vào phương pháp bạn thích, độ dài của tập lệnh này có thể được giảm bớt. Có những hạn chế nhất định như bạn có thể nhận thấy
Tập lệnh không thể phân biệt giữa các chuỗi số bạn muốn định dạng. Tuy nhiên, nó có thể được thay đổi dễ dàng tùy thuộc vào nhu cầu và trường hợp sử dụng của bạn
Phần kết luận
Trong bài viết này, chúng tôi đã xem xét một số cách chuyển đổi số thành chuỗi tiền tệ thích hợp. Chúng tôi đã đề cập đến phương pháp
en_GB
af_ZA
sq_AL
gsw_FR
am_ET
ar_SA
ar_IQ
ar_EG
ar_LY
ar_DZ
...
1, cũng như các mô-đun en_GB
af_ZA
sq_AL
gsw_FR
am_ET
ar_SA
ar_IQ
ar_EG
ar_LY
ar_DZ
...
2 và deposit = 0.93
future_value = deposit * [[1 + [0.0225]]**1000]
future_value
>>> 4283508449.7111807
14Cuối cùng, chúng tôi đã kết hợp các phương thức này với mô-đun biểu thức chính quy của Python để đạt được phạm vi sử dụng rộng hơn. Cuối cùng, tôi hy vọng bạn có thể học được điều gì đó mới từ tất cả những điều này có thể giúp bạn tiết kiệm thời gian