Tại sao làm tròn Python lạ?

cấp Edwards

2002-03-11 19. 12. 06 UTC

liên kết cố định

Tôi hiểu và đồng ý với những gì bạn đang nói. Tuy nhiên,
ở một số ngôn ngữ (ví dụ VB) có thể trả về kết quả
số từ một hàm chỉ có hai (hoặc bất kỳ số nào khác) .
places.

Nếu ngôn ngữ đang sử dụng biểu diễn BCD thì điều này đúng.
Nếu nó đang sử dụng FP nhị phân, thì điều này là không đúng. Một số ngôn ngữ
có hỗ trợ toán BCD. Quay lại những ngày CP/M, hầu hết
các triển khai ngôn ngữ (BASIC, FORTRAN, Pascal, bất cứ thứ gì) được hỗ trợ
dấu chấm động BCD hoặc dấu phẩy động nhị phân. Hỗ trợ BCD
thường được gọi là "chế độ tài chính" hoặc cái gì đó không rõ ràng
đại loại như thế.

Python không có BCD (ít nhất là không có trong bản phân phối tiêu chuẩn).

Không phải là biểu diễn chuỗi được định dạng mà là giá trị
số thực tế có thể được sử dụng trong các tính toán tiếp theo. Tất nhiên, giá trị này
là giá trị gần đúng và đã thực sự bị cắt bớt chứ không phải
"làm tròn. "

Hoặc là BCD và thực sự có "số thập phân" hoặc là
FP nhị phân và nó hoàn toàn giống với những gì bạn nhận được trong Python.
Tôi đồng ý với bạn rằng VB đang sử dụng BCD.

Dù sao thì bây giờ chúng ta đang tranh luận xem có bao nhiêu thiên thần có thể nhảy múa trên đầu
của một chiếc ghim.

Không hẳn. Việc sử dụng đúng cách dấu phẩy động và các hàm như
round() yêu cầu rằng biểu diễn bên dưới
được hiểu.

--
Grant Edwards Grante Yow. Tôi được xếp loại PG-34.
tại
tham quan. com

cấp Edwards

2002-03-10 16. 31. 51 UTC

liên kết cố định

Bài đăng của brobbins333
OK, điều đó hoàn toàn hợp lý. Trong trường hợp của tôi, tôi chỉ đơn giản là tìm kiếm
một cách có thể dự đoán được để trả về một số có hai
vị trí

Điều đó là không thể. "Số" mà bạn đang nói đến
không _có_ chữ số thập phân. Đó là số dấu phẩy động nhị phân
. Nó có "địa điểm nhị phân". Về lý thuyết, bạn có thể viết một
hàm làm tròn đến N vị trí nhị phân, nhưng tôi không biết
hàm đó sẽ hữu ích như thế nào.

Để nói một cách có ý nghĩa về số thập phân, bạn
phải sử dụng biểu diễn cơ số 10. BCD dấu phẩy động hoặc BCD
điểm cố định. Các chuỗi như "123. 456" là một loại dấu phẩy động BCD
và bạn có thể làm tròn đến N chữ số thập phân khi
chuyển đổi từ dấu phẩy động nhị phân thành "Chuỗi/BCD FP".

f = 123. 4567
s = "%0. 2f" % f

Bài đăng của brobbins333

f = 123. 456
s = "%0. 2f" % f
f

123. 456

Bài đăng của brobbins333

s

'123. 46'

"Chuỗi/BCD FP" như tôi đã gọi nó có thể đại diện cho các số
tốt, nhưng vì bạn không thể thực hiện bất kỳ phép toán nào trên chúng .
it's of limited value.

Vì bạn đang sử dụng dấu phẩy động nhị phân nên hàm round()
thực sự đang chuyển đổi giá trị đầu vào của dấu phẩy động nhị phân
. Nhưng, X có thể không được biểu diễn chính xác. Nếu bạn đang
in the future it will have the requested number of decimal
places. But, X may not be exactly representable. If you're
sử dụng round(x,N) thì có lẽ bạn đang tự lừa mình.

Nếu bạn _thực sự_ muốn một số có N chữ số thập phân.

chủ đề về các số cơ số 10 cho Python thỉnh thoảng xuất hiện,
và tôi tin rằng có sẵn các gói BCD. Nếu bạn
thực sự muốn tính toán trong cơ số 10, bạn có thể muốn
tìm kiếm "BCD" trong kho lưu trữ của nhóm tin.

--
Grant Edwards Grante Yow. Hãy về nhà với
với tôi. Tôi có Tylenol.
tham quan. com

brobbins333

2002-03-11 18. 51. 01 giờ UTC

liên kết cố định

Tôi hiểu và đồng ý với những gì bạn đang nói. Tuy nhiên,
ở một số ngôn ngữ (ví dụ VB) có thể trả về kết quả
số từ một hàm chỉ có hai (hoặc bất kỳ số nào khác) . Không phải là một biểu diễn chuỗi được định dạng, mà là một giá trị
places. Not a formatted string representation, but an actual numerical
số thực tế có thể được sử dụng trong các tính toán tiếp theo. Tất nhiên, giá trị này
là giá trị gần đúng và thực sự đã bị cắt bớt chứ không phải
"làm tròn. "

Dù sao thì, bây giờ chúng ta đang tranh cãi xem có bao nhiêu thiên thần có thể nhảy trên đầu
của một chiếc ghim. Tôi hiểu vấn đề và có thể giải quyết nó. Nhóm này
là một tài nguyên tuyệt vời. Cảm ơn tất cả sự giúp đỡ và thời gian của bạn.

Bruce

On Sun, 10 Mar 2002 16. 31. 51 GMT, được cấp lúc truy cập. com (Grant Edwards)

Bài đăng của Grant Edwards

Bài đăng của brobbins333
OK, điều đó hoàn toàn hợp lý. Trong trường hợp của tôi, tôi chỉ đơn giản là tìm kiếm
một cách có thể dự đoán được để trả về một số có hai
vị trí thập phân

Điều đó là không thể. "Số" mà bạn đang nói đến
không _có_ chữ số thập phân. Đó là số dấu phẩy động nhị phân
. Nó có "địa điểm nhị phân". Về lý thuyết, bạn có thể viết một
hàm làm tròn đến N vị trí nhị phân, nhưng tôi không biết
hàm đó sẽ hữu ích như thế nào.
Để nói một cách có ý nghĩa về số thập phân, bạn
phải sử dụng biểu diễn cơ số 10. BCD dấu phẩy động hoặc BCD
điểm cố định. Các chuỗi như "123. 456" là một loại dấu phẩy động BCD
và bạn có thể làm tròn đến N chữ số thập phân khi
f = 123. 4567
s = "%0. 2f" % f

Bài đăng của brobbins333

Bài đăng của Grant Edwards
f = 123. 456
s = "%0. 2f" % f
f

123. 456

Bài đăng của brobbins333

Bài đăng của Grant Edwards
s

'123.46'
"String/BCD FP" as I've termed it can represent numbers just
fine, but since you can't do any mathematical operations on them
it's of limited value.
Since you're using binary floating point, the round() function
is actually converting it's binary floating point input value
to the closest value to X such that if X were converted to BCD
in the future it will have the requested number of decimal
places. But, X may not be exactly representable. If you're
using round(x,N) your probably just fooling yourself.
the topic of base-10 numbers for Python comes up occasionally,
and I believe that there are BCD packages available. If you
really want to do your calculations in base 10, you might want
to search the newsgroup archives for "BCD".
--
Grant Edwards grante Yow! Please come home with
at me.. I have Tylenol!!
visi.com

hậu cần

2002-03-09 23. 57. 02 UTC

liên kết cố định

Tôi ngạc nhiên là cái này không có trong Câu hỏi thường gặp.
Bạn đang nhìn thấy đối tượng thực chứ không phải là bản trình bày có thể in được của đối tượng đó.

vòng(56. 78923, 2)

56. 789999999999999

vòng in(56. 78923, 2)

56. 79

"%f" % round(56. 78923, 2)

'56. 790000'

--
-

Tôi hiểu vấn đề về lỗi làm tròn với số nhị phân.
Tuy nhiên, chức năng làm tròn của các ngôn ngữ khác hoạt động xung quanh nó và
trả về kết quả có thể sử dụng được. Họ có gì mà Python không có?
BR
ps -- tên của bạn rất quen thuộc. tôi nghĩ rằng tôi đã đọc một trong những cuốn sách của bạn.
Thứ bảy, ngày 09 tháng 3 năm 2002 23. 13. 50 GMT, Erik de Castro Lopo

hàm round() đôi khi sẽ trả về một kết quả có thể dự đoán được, như
round(45. 67891, 2)

45. 68

vòng(56. 78923, 2)

56. 789999999999999

2.1 and 2.2 both behave this way on two different (Windows) computers.
What's going on here?

Những gì bạn sẽ tìm thấy là một số số như 2, 0. 25, v.v. có thể
được biểu diễn chính xác ở định dạng dấu phẩy động trong khi những thứ khác như
2/3 thì không thể.
Chuyện là như vậy.
Erik
--
+------------------- . com (Có, nó hợp lệ)
Erik de Castro Lopo nospam at mega-nerd.com (Yes it's valid)
+---------------------------------- . Một loại thuốc thần kinh, phổ biến vào những năm 80, có thể được phát triển tại UC
BSD: A psychoactive drug, popular in the 80s, probably developed at UC
Berkeley hoặc nơi nào đó. Tương tự về nhiều mặt với loại thuốc
chỉ kê đơn có tên là "Hệ thống V", nhưng hữu ích hơn rất nhiều. (Hoặc, ít nhất,
thú vị hơn. ) Tên hóa học đầy đủ là "Phân phối tiêu chuẩn Berkeley".

Erik de Castro Lopo

2002-03-10 01. 29. 18 UTC

liên kết cố định

Tôi biết tên bạn rất quen. Tôi đang đọc cuốn sách của bạn ngay bây giờ.
Thật xuất sắc.

Cảm ơn. -).

VB cho một, trả về kết quả được làm tròn thích hợp trên
các số ngoan cố này.

VB có thể lưu trữ các số dấu phẩy động được làm tròn dưới dạng chuỗi thay vì
của biểu diễn nhị phân thông thường. VB giống như hầu hết các ngôn ngữ
kiểu tập lệnh (nghĩa là các ngôn ngữ được nhập không theo chuỗi) thường ẩn biểu diễn
của các biến của nó.

Tôi cá là C cũng có thể làm được,
nhưng bạn nên biết rõ hơn tôi.

Python như được viết bằng C, nhận hành vi của nó trực tiếp từ C. Những gì
bạn đang thấy thực sự là hành vi của C.

Vấn đề là tôi đang cố gắng sử dụng giá trị trả về của hàm round() làm
giá trị trả về của một hàm khác, vì vậy, hãy sử dụng Print để dọn dẹp nó< . Có gợi ý nào không?
really doesn't do me any good. Any suggestions?

Tôi đề xuất rằng thay vì làm tròn số, bạn hãy chuyển đổi nó
thành một chuỗi có độ chính xác cần thiết.

erikd at coltrane > python
Python 2. 1. 2 (#1, ngày 18 tháng 1 năm 2002, 18. 05. 45)
[GCC 2. 95. 4 (bản phát hành trước của Debian)] trên linux2
Nhập "bản quyền", "tín dụng" hoặc "giấy phép" để biết thêm thông tin.

x = 56. 78923
x_as_string = "%. 2f" % x
in x_as_string

56. 79

Chỉ những gì bạn muốn. Tuy nhiên, hãy nhớ rằng nếu bạn muốn thao tác trên
số bằng số học tiêu chuẩn, bạn cần thao tác trên x thay vì
x_as_string.

Erik

--
+------------------- . com (Có, nó hợp lệ)
Erik de Castro Lopo nospam at mega-nerd.com (Yes it's valid)
+---------------------------------- . "
"The whole principle is wrong; it's like demanding that grown men live on
skim milk because the baby can't eat steak."
- tác giả Robert A. Heinlein về kiểm duyệt.

brobbins333

2002-03-09 23. 41. 17 UTC

liên kết cố định

Tôi hiểu vấn đề lỗi làm tròn với số nhị phân.
Tuy nhiên, chức năng làm tròn của các ngôn ngữ khác hoạt động xung quanh nó và
trả về kết quả có thể sử dụng được. Họ có gì mà Python không có?

BR

ps -- tên của bạn rất quen thuộc. tôi nghĩ rằng tôi đã đọc một trong những cuốn sách của bạn.

Thứ bảy, ngày 09 tháng 3 năm 2002 23. 13. 50 GMT, Erik de Castro Lopo

hàm round() đôi khi sẽ trả về kết quả có thể dự đoán được, như
round(45. 67891, 2)

Bài đăng của logistix
45. 68

vòng(56. 78923, 2)

Bài đăng của logistix
56. 789999999999999

2.1 and 2.2 both behave this way on two different (Windows) computers.
What's going on here?

Những gì bạn sẽ tìm thấy là một số số như 2, 0. 25, v.v. có thể
được biểu diễn chính xác ở định dạng dấu phẩy động trong khi những thứ khác như
2/3 thì không thể.
Chuyện là như vậy.
Erik
--
+------------------- . com (Có, nó hợp lệ)
Erik de Castro Lopo nospam at mega-nerd.com (Yes it's valid)
+---------------------------------- . Một loại thuốc thần kinh, phổ biến vào những năm 80, có thể được phát triển tại UC
BSD: A psychoactive drug, popular in the 80s, probably developed at UC
Berkeley hoặc nơi nào đó. Tương tự về nhiều mặt với loại thuốc
chỉ kê đơn có tên là "Hệ thống V", nhưng hữu ích hơn rất nhiều. (Hoặc, ít nhất,
thú vị hơn. ) Tên hóa học đầy đủ là "Phân phối tiêu chuẩn Berkeley".

brobbins333

2002-03-10 00. 55. 39 UTC

liên kết cố định

Tôi biết tên bạn rất quen. Tôi đang đọc cuốn sách của bạn ngay bây giờ.
Thật xuất sắc. VB cho một, trả về kết quả được làm tròn thích hợp trên
các số ngoan cố này. Tôi sẵn sàng cá rằng C cũng có thể làm được,
nhưng bạn nên biết rõ hơn tôi.

Vấn đề là tôi đang cố gắng sử dụng giá trị trả về của hàm round() làm
giá trị trả về của một hàm khác, vì vậy, hãy sử dụng Print để dọn dẹp nó< . Có gợi ý nào không?
really doesn't do me any good. Any suggestions?

BR

Vào Chủ nhật, ngày 10 tháng 3 năm 2002 00. 16. 37 giờ GMT, Erik de Castro Lopo

Bài đăng của Erik de Castro Lopo

Tôi hiểu vấn đề về lỗi làm tròn với số nhị phân.
Tuy nhiên, hàm làm tròn của các ngôn ngữ khác hoạt động xung quanh nó và
trả về kết quả có thể sử dụng được. Họ có gì mà Python không có?

Có thể các ngôn ngữ tập lệnh khác có tính năng bao gồm
biểu diễn in hiện tại với đối tượng dấu phẩy động. Tuy nhiên
điều này sẽ làm tôi hơi ngạc nhiên.
Bạn đã thử ví dụ cụ thể đó với các ngôn ngữ khác chưa? . Rõ ràng phương thức
at Perl and it doesn't have a round function. Apparently the preferred
ưa thích trong Perl là sprintf ("%. 2f", 56. 78923) trả về một chuỗi
thay vì một số float.
Sau khi một số float được biểu diễn dưới dạng một chuỗi, bạn sẽ có hành vi như mong muốn
sau đó.

ps -- tên bạn rất quen. tôi nghĩ rằng tôi đã đọc một trong những cuốn sách của bạn.

I only have one, "SAMs Teach yourself C for Linux Programming in 21 days".
I also have a couple of Free Software packages out there.
Erik
--
+-----------------------------------------------------------+
Erik de Castro Lopo nospam at mega-nerd.com (Yes it's valid)
+-----------------------------------------------------------+
"If dolphins are so smart, why do they live in igloos?" -Eric Cartman

Tại sao Python có lỗi làm tròn?

Đó là sự cố xảy ra khi biểu diễn bên trong của số dấu phẩy động, sử dụng một số chữ số nhị phân cố định để biểu thị số thập phân . Rất khó để biểu diễn một số thập phân dưới dạng nhị phân nên trong nhiều trường hợp dẫn đến sai số làm tròn nhỏ.

Tại sao 0. 1 0. 2 không phải là 0. 3 con trăn?

Tương tự, giá trị nhị phân của 0. 2 được lưu dưới dạng 0. 001100110. Bây giờ, khi bạn thêm 0. 1 + 0. 2 bằng Python (hoặc bằng một số ngôn ngữ lập trình khác), Python chuyển đổi 0. 1 và 0. 2 về dạng nhị phân. Sau đó, nó thực hiện phép cộng. Kết quả sẽ không bao giờ bằng 0. 3 chính xác .

Tại sao 0. 5 tròn thành 0 trong Python?

Cho =0. 5, hàm round() làm tròn số thành số chẵn gần nhất . Vì vậy, 0. 5 được làm tròn thành 0 và -0 cũng vậy. 5; . 5 và 34. 5 đều được làm tròn thành 34; . 5 -34. 5 đều được làm tròn thành -34, v.v.

Tại sao Python vòng 2. 5 đến 2?

Ví dụ: 2. 5 sẽ được làm tròn thành 2, vì 2 là số chẵn gần nhất và 3. 5 sẽ được làm tròn thành 4.